Jump to content

    
Sign in to follow this  
prst

TMS320F28027 - SPI - slave mode - проблемы

Recommended Posts

Ребята, подскажите как решить проблему.

Заложил 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" не нашел ни каких примеров, только режим мастера, мне нужно подсмотреть, чтоб понять, что у меня не так.

- может у вас есть образец?

- Или там есть какая-то тонкость которую я не уловил в документации?

Share this post


Link to post
Share on other sites
А не пробовали менять полярность и фазу клока?

пробовал, вчера и сегодня, и как раз сегодня осциллографом очередной раз дебажил это, и параллельно менял режимы в FTDI.

вчера ни чего не получалось, возможно комбинацию нужную пропустил, сегодня сдвиг есть положительный.

Соединилось на 6 Мбит, тактирование в 10 и 12 Мбит всё с теми же артефактами.

Мне как раз и нужно добиться 10..12 Мбит в слэйв режиме.

Share this post


Link to post
Share on other sites

Не смотря на то, что проблемы что описаны выше, уже решил, наткнулся только что на рускоязычную статью, может кому пригодится в будущем, оставлю её тут.

http://blablacode.ru/tms320/tms320-%D0%B4%...%D0%BE-spi.html

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this