Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR32 SPI прием и передача
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
69ka
Добрый день, столкнулся с проблемой на микроконтроллере 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 и плата отрабатывает верно (необходимые светодиоды светятся). Посылка осуществляется в цикле. Что может быть не так? Как получить верный ответ, пробовал даже оставлять от кода только строчки отправки и сразу чтение из регистра без задержек но ничего не помогло..
toweroff
Код
      if (!timeout--) {
         return SPI_ERROR_TIMEOUT;
         return 0xFFFF;
      }

круто

вообще, чтобы что-то получить по SPI, нужно сначала записать в SPI
и только потом смотреть всякие флаги
69ka
Цитата(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;
      }

круто


это осталось от проверки что бы увидеть, тут он выходит в ошибку или нет, просто забыл закомментировать.
k155la3
Это у Вас папилац не летает с конкретным 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 кваксов)

69ka
Цитата(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, что все равно что то не очень получается...
k155la3
По-первых, в таком случае, (вы фактически пишите-отлаживаете сами, на основе библиотечных ф-ий) ,
- отключить слейв(ы).
- "закольцевать" 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. Возможно в этом причина.
При работе функций как приема, так и передачи - проверяйте "свободность" регистров на передачу.
Проверяйте, перед чтением последнего байта, что буфер и сдвиговый регистр передатчика свободны.

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


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


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

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


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

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

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.