|
|
  |
AVR32 SPI прием и передача, Одновременный прием и передача |
|
|
|
Sep 6 2016, 07:51
|
Группа: Участник
Сообщений: 6
Регистрация: 6-09-16
Пользователь №: 93 227

|
Добрый день, столкнулся с проблемой на микроконтроллере AVR32UC3C0512, мне необходимо передать сообщение по SPI на микросхему TLE6208-6G и одновременно с этой передачей считать ответ. Разница в передаче и ответе на диаграмме:  при передаче с кодом: Код spi_select_device(&AVR32_SPI0, &SPI_MVK_CS1); spi_write(&AVR32_SPI0, data_buff); while((AVR32_SPI0.cr & AVR32_SPI_SR_TXEMPTY_MASK) != 0) {};
spi_read(&AVR32_SPI0, &result); spi_set_chipselect_delay_bct(&AVR32_SPI0, &SPI_MVK_CS1, CONFIG_SPI_MASTER_DELAY_BCT); spi_deselect_device(&AVR32_SPI0, &SPI_MVK_CS1); код функции spi_read: Код spi_status_t spi_read(volatile avr32_spi_t *spi, uint16_t *data) {unsigned int timeout = SPI_TIMEOUT;
while ((spi->sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) != (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; return 0xFFFF; } }
*data = (spi->rdr & 0x0000FFFF) >> AVR32_SPI_RDR_RD_OFFSET;
return SPI_OK; } в result 0. хотя отправляю не 0 и плата отрабатывает верно (необходимые светодиоды светятся). Посылка осуществляется в цикле. Что может быть не так? Как получить верный ответ, пробовал даже оставлять от кода только строчки отправки и сразу чтение из регистра без задержек но ничего не помогло..
|
|
|
|
|
Sep 6 2016, 16:22
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Код if (!timeout--) { return SPI_ERROR_TIMEOUT; return 0xFFFF; } круто вообще, чтобы что-то получить по SPI, нужно сначала записать в SPI и только потом смотреть всякие флаги
|
|
|
|
|
Sep 7 2016, 06:18
|
Группа: Участник
Сообщений: 6
Регистрация: 6-09-16
Пользователь №: 93 227

|
Цитата(toweroff @ Sep 6 2016, 17:22)  вообще, чтобы что-то получить по SPI, нужно сначала записать в SPI и только потом смотреть всякие флаги запись осуществляется в функции spi_write(&AVR32_SPI0, data_buff), которая чуть выше по основному коду: Код spi_status_t spi_write(volatile avr32_spi_t *spi, uint16_t data) { uint32_t timeout = SPI_TIMEOUT;
while (!(spi->sr & AVR32_SPI_SR_TDRE_MASK)) { if (!timeout--) { return SPI_ERROR_TIMEOUT; //return 0xFFFF; } }
spi->tdr = data << AVR32_SPI_TDR_TD_OFFSET;
return SPI_OK; } после переноса в регистр tdr МК начинает передавать сообщение. после чего идет проверка завершения передачи битом командного регистра отвечающего за то что буфер TX пуст Код while((AVR32_SPI0.cr & AVR32_SPI_SR_TXEMPTY_MASK) != 0) {}; а после чего пытаюсь читать. он не вываливается в эту ошибку он просто берет из приемного буфера от 0 то FF. Цитата(69ka @ Sep 6 2016, 08:51)  плата отрабатывает верно (необходимые светодиоды светятся) Цитата(toweroff @ Sep 6 2016, 17:22)  Код if (!timeout--) { return SPI_ERROR_TIMEOUT; return 0xFFFF; } круто это осталось от проверки что бы увидеть, тут он выходит в ошибку или нет, просто забыл закомментировать.
Сообщение отредактировал 69ka - Sep 7 2016, 06:19
|
|
|
|
|
Sep 7 2016, 06:35
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Это у Вас папилац не летает с конкретным slave-SPI или вообще ? Вопрос в смысле, функции для работы с SPI отлажены или нет. Если самописные, то рекомендую использовать такой интерфейс: Код SET_CS_RTC; rx_spi[0] = SPI_Write( command1); rx_spi[1] = SPI_Write( Data1 ); . . . . RESET_CS_ALL; Обработка ошибок - наподобие errno; При управлении узлом SPI в режиме опроса флагов, можно чего-то не учесть, например буферизацию регистров Tx Rx. Курить даташит все равно придется. Как вариант - взять готовый драйвер SPI. Кроме того очень полезная весч лог. анализатор SPI, наподобие Saleae LOGIC (20-30 кваксов)
|
|
|
|
|
Sep 7 2016, 06:55
|
Группа: Участник
Сообщений: 6
Регистрация: 6-09-16
Пользователь №: 93 227

|
Цитата(k155la3 @ Sep 7 2016, 07:35)  Это у Вас папилац не летает с конкретным slave-SPI или вообще ? Вопрос в смысле, функции для работы с SPI отлажены или нет. отлажены на осциллографе я вижу все эти пакеты, даже ответ, но мне нужно его прочитать что не получается сделать. использую библиотеки для AVRStudio 6 Код // From module: SPI - Serial Peripheral Interface #include <spi.h>
// From module: SPI - UC3 implementation #include <spi_master.h> #include <uc3_spi/spi_master.h> из-за то что не получается начал править эти библиотеки и пробовать использовать другие флаги и искать ошибки. пытался считывать по флагам завершение приема, пытался написать прерывание по приему SPI, что все равно что то не очень получается...
|
|
|
|
|
Sep 7 2016, 08:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
По-первых, в таком случае, (вы фактически пишите-отлаживаете сами, на основе библиотечных ф-ий) , - отключить слейв(ы). - "закольцевать" SPI - соединяем MOSI-MISO (на процессоре, все слейвы должны быть отключены от шины) При этом на первый же засланый в SPI байт Вы должны получить егоже по Rx. При корректной работе ф-ий. - Код (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) != (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) Такие конструкции часто работают не так как предполагает автор, малочитабельны и способствуют ошибкам. Разложите на пару if. Возможно в этом причина. При работе функций как приема, так и передачи - проверяйте "свободность" регистров на передачу. Проверяйте, перед чтением последнего байта, что буфер и сдвиговый регистр передатчика свободны.
|
|
|
|
|
Sep 7 2016, 08:43
|
Группа: Участник
Сообщений: 6
Регистрация: 6-09-16
Пользователь №: 93 227

|
Цитата(k155la3 @ Sep 7 2016, 09:24)  По-первых, в таком случае, (вы фактически пишите-отлаживаете сами, на основе библиотечных ф-ий) , - отключить слейв(ы). - "закольцевать" SPI - соединяем MOSI-MISO (на процессоре, все слейвы должны быть отключены от шины) При этом на первый же засланый в SPI байт Вы должны получить егоже по Rx. При корректной работе ф-ий. Спасибо, щас буду пробовать, о результате отпишусь.
|
|
|
|
|
Sep 7 2016, 10:26
|
Группа: Участник
Сообщений: 6
Регистрация: 6-09-16
Пользователь №: 93 227

|
Проверил, все работает, ничего не меняя в коде программы... ничего не понимаю... но если подключаю обратно показывает 0xFFFFFFFF...
|
|
|
|
|
Sep 7 2016, 14:04
|
Группа: Участник
Сообщений: 6
Регистрация: 6-09-16
Пользователь №: 93 227

|
Цитата(k155la3 @ Sep 7 2016, 12:20)  Не понял, что работает. На кольце ? Если так - проверяйте по даташитам настройки SPI - фазировки и полярности, требуемые для Вашего slave. Да сделал перемычку отключил ведомых. все работает считываю то что посылаю. Осциллограф видит и передаваемый и принимаемый пакеты, но не могу МК не хочет их видеть. Ладно буду дальше пробовать. Спасибо за помощь)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|