реклама на сайте
подробности

 
 
> AVR32 SPI прием и передача, Одновременный прием и передача
69ka
сообщение Sep 6 2016, 07:51
Сообщение #1





Группа: Участник
Сообщений: 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 и плата отрабатывает верно (необходимые светодиоды светятся). Посылка осуществляется в цикле. Что может быть не так? Как получить верный ответ, пробовал даже оставлять от кода только строчки отправки и сразу чтение из регистра без задержек но ничего не помогло..
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
k155la3
сообщение Sep 7 2016, 08:24
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 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. Возможно в этом причина.
При работе функций как приема, так и передачи - проверяйте "свободность" регистров на передачу.
Проверяйте, перед чтением последнего байта, что буфер и сдвиговый регистр передатчика свободны.

Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 23:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01362 секунд с 7
ELECTRONIX ©2004-2016