prst 0 13 августа, 2015 Опубликовано 13 августа, 2015 · Жалоба Ребята, подскажите как решить проблему. Заложил TMS320F28027 - в SPI - выбран slave mode(так нужно) Всё это безобразие общается с FTDI в режиме MPSSE, и написана прога под линуксом для взаимодействия, все ни как не получалось добиться адекватного поведения на высоких скоростях, выше 1МБита, полез смотреть осциллографом, и очумел от удивления, странности с сдвигом, или задержками, и клоком, от сюда проблемы... и вторая проблема - глюки значения статусного регистра при отправке данных. Детальнее о проблемах 1) скорость выше 1 МБит - эту проблему я рассмотрел в осциллографе, когда приходит смена фронта клока, с 1->0 то в этот момент данные только начинают меняться, и если скорость выше 1 МБит то срабатывает с запазданием в следующем клоке, например передается 0x44 а принимается 0x22 и т д 2) Значение статус-регистра тоже ведет себя некорректно. Обычно один байт(точнее 16 битное слово) передается корректно, то есть "SPI_FifoStatus_e SPI_getRxFifoStatus(SPI_Handle spiHandle)" возвращает как положено - SPI_FifoStatus_Empty, и всё... дальше пурга начинается. Статусный регистр SPIFFRX возвращает с функции "SPI_FifoStatus_e SPI_getRxFifoStatus(SPI_Handle spiHandle)" - то возвращается бесконечно SPI_FifoStatus_1_Word, а иногда правильное SPI_FifoStatus_Empty, причем крайне "иногда" вот так запись значения и чтение статуса - всё как по документации SPI_write( mySpi, temp ); // adc_buffer[0] while(SPI_FifoStatus_Empty!=SPI_getTxFifoStatus(mySpi)); на строчке - while(SPI_FifoStatus_Empty!=SPI_getTxFifoStatus(mySpi)); - подвисает пробовал писать прямо в регистры, не используя API SpiaRegs.SPITXBUF = temp; while ( SpiaRegs.SPIFFTX.bit.TXFFST != 0) {} результат идентичен, виснет на строке - while ( SpiaRegs.SPIFFTX.bit.TXFFST != 0) {} так же в даташите есть пример для 3-wire, уже и его пробовал, хотя он по идее и не должен работать, так как у меня 4-wire mode Uint16 data; Uint16 dummy; SpiaRegs.SPICTL.bit.TALK = 1; // Enable Transmit path SpiaRegs.SPITXBUF = data; // Slave transmits data while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Wait until data rx'd dummy = SpiaRegs.SPIRXBUF; // Clears junk data from itself тут тоже - на строчке while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} - зависает и чета ждёт. перерыл гугл, в режиме "slave mode" не нашел ни каких примеров, только режим мастера, мне нужно подсмотреть, чтоб понять, что у меня не так. - может у вас есть образец? - Или там есть какая-то тонкость которую я не уловил в документации? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 14 августа, 2015 Опубликовано 14 августа, 2015 · Жалоба А не пробовали менять полярность и фазу клока? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 14 августа, 2015 Опубликовано 14 августа, 2015 · Жалоба А не пробовали менять полярность и фазу клока? пробовал, вчера и сегодня, и как раз сегодня осциллографом очередной раз дебажил это, и параллельно менял режимы в FTDI. вчера ни чего не получалось, возможно комбинацию нужную пропустил, сегодня сдвиг есть положительный. Соединилось на 6 Мбит, тактирование в 10 и 12 Мбит всё с теми же артефактами. Мне как раз и нужно добиться 10..12 Мбит в слэйв режиме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prst 0 17 августа, 2015 Опубликовано 17 августа, 2015 · Жалоба Не смотря на то, что проблемы что описаны выше, уже решил, наткнулся только что на рускоязычную статью, может кому пригодится в будущем, оставлю её тут. http://blablacode.ru/tms320/tms320-%D0%B4%...%D0%BE-spi.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AltemirX 0 4 сентября, 2015 Опубликовано 4 сентября, 2015 · Жалоба PrSt Наступал на подобную проблему в 5509, поэтому сразу задам следующие вопросы: 1. На какой частоте работает ядро 28027? Чему равна частота LSPCLK? От этой частоты образуется времянка tc(LCO), Cycle time, которая по дефолту 66,67нс для 60МГц проца ( см. Table 6-5 ... Table 6-7 http://www.ti.com/lit/ds/symlink/tms320f28022.pdf), а может быть настроена минимум 16,67нс. 2. Согласно указанному выше даташиту Table 6-35. SPI Slave Mode External Timing (Clock Phase = 0) - tc(SPC)S Cycle time, SPICLK 4tc(LCO) ns, т.е. при tc(LCO)=16,67нс получим максимум 15МГц; 3. Для режима Table 6-36. SPI Slave Mode External Timing (Clock Phase = 1) tc(SPC)S Cycle time, SPICLK 8tc(LCO) ns, т.е. в два раза медленнее и всего 7,5МГц. Вывод: забудьте о 12 Мбит/с для 40МГц проца (максимум 10 Мбит/с), внимательно проверьте настройки LSPCLK и Clock Phase. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться