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

 
 
> 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
Ответов
toweroff
сообщение Sep 6 2016, 16:22
Сообщение #2


Гуру
******

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



Код
      if (!timeout--) {
         return SPI_ERROR_TIMEOUT;
         return 0xFFFF;
      }

круто

вообще, чтобы что-то получить по SPI, нужно сначала записать в SPI
и только потом смотреть всякие флаги
Go to the top of the page
 
+Quote Post
69ka
сообщение Sep 7 2016, 06:18
Сообщение #3





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 19th August 2025 - 10:20
Рейтинг@Mail.ru


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