Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TMS320F28027 - SPI - slave mode - проблемы
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Сигнальные процессоры и их программирование - DSP
PrSt
Ребята, подскажите как решить проблему.
Заложил 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
А не пробовали менять полярность и фазу клока?
PrSt
Цитата(doom13 @ Aug 14 2015, 21:51) *
А не пробовали менять полярность и фазу клока?

пробовал, вчера и сегодня, и как раз сегодня осциллографом очередной раз дебажил это, и параллельно менял режимы в FTDI.
вчера ни чего не получалось, возможно комбинацию нужную пропустил, сегодня сдвиг есть положительный.
Соединилось на 6 Мбит, тактирование в 10 и 12 Мбит всё с теми же артефактами.
Мне как раз и нужно добиться 10..12 Мбит в слэйв режиме.
PrSt
Не смотря на то, что проблемы что описаны выше, уже решил, наткнулся только что на рускоязычную статью, может кому пригодится в будущем, оставлю её тут.
http://blablacode.ru/tms320/tms320-%D0%B4%...%D0%BE-spi.html
Altemir
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.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.