Перейти к содержанию
    

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А не пробовали менять полярность и фазу клока?

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...