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

 
 
 
Reply to this topicStart new topic
> 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
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
k155la3
сообщение Sep 7 2016, 06:35
Сообщение #4


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

Группа: Свой
Сообщений: 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 кваксов)

Go to the top of the page
 
+Quote Post
69ka
сообщение Sep 7 2016, 06:55
Сообщение #5





Группа: Участник
Сообщений: 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, что все равно что то не очень получается...
Go to the top of the page
 
+Quote Post
k155la3
сообщение Sep 7 2016, 08:24
Сообщение #6


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

Группа: Свой
Сообщений: 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
69ka
сообщение Sep 7 2016, 08:43
Сообщение #7





Группа: Участник
Сообщений: 6
Регистрация: 6-09-16
Пользователь №: 93 227



Цитата(k155la3 @ Sep 7 2016, 09:24) *
По-первых, в таком случае, (вы фактически пишите-отлаживаете сами, на основе библиотечных ф-ий) ,
- отключить слейв(ы).
- "закольцевать" SPI - соединяем MOSI-MISO (на процессоре, все слейвы должны быть отключены от шины)
При этом на первый же засланый в SPI байт Вы должны получить егоже по Rx. При корректной работе ф-ий.


Спасибо, щас буду пробовать, о результате отпишусь.
Go to the top of the page
 
+Quote Post
69ka
сообщение Sep 7 2016, 10:26
Сообщение #8





Группа: Участник
Сообщений: 6
Регистрация: 6-09-16
Пользователь №: 93 227



Проверил, все работает, ничего не меняя в коде программы... ничего не понимаю... но если подключаю обратно показывает 0xFFFFFFFF...
Go to the top of the page
 
+Quote Post
k155la3
сообщение Sep 7 2016, 11:20
Сообщение #9


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(69ka @ Sep 7 2016, 13:26) *
Проверил, все работает, ничего не меняя в коде программы... ничего не понимаю... но если подключаю обратно показывает 0xFFFFFFFF...


Не понял, что работает. На кольце ?
Если так - проверяйте по даташитам настройки SPI - фазировки и полярности, требуемые для Вашего slave.

Go to the top of the page
 
+Quote Post
69ka
сообщение Sep 7 2016, 14:04
Сообщение #10





Группа: Участник
Сообщений: 6
Регистрация: 6-09-16
Пользователь №: 93 227



Цитата(k155la3 @ Sep 7 2016, 12:20) *
Не понял, что работает. На кольце ?
Если так - проверяйте по даташитам настройки SPI - фазировки и полярности, требуемые для Вашего slave.


Да сделал перемычку отключил ведомых. все работает считываю то что посылаю.
Осциллограф видит и передаваемый и принимаемый пакеты, но не могу МК не хочет их видеть.
Ладно буду дальше пробовать. Спасибо за помощь)
Go to the top of the page
 
+Quote Post
k155la3
сообщение Sep 7 2016, 14:07
Сообщение #11


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(69ka @ Sep 7 2016, 17:04) *
Да сделал перемычку отключил ведомых. все работает считываю то что посылаю.
Осциллограф видит и передаваемый и принимаемый пакеты, но не могу МК не хочет их видеть.
Ладно буду дальше пробовать. Спасибо за помощь)

Ну разве что слейвы CSы не поделили. Удачи sm.gif

Go to the top of the page
 
+Quote Post

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

 


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


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