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

 
 
 
Reply to this topicStart new topic
> Как определить состояние NSS на SPI salve?, SPI_NSS = SPI_NSS_Hard
AVR
сообщение Sep 15 2015, 22:17
Сообщение #1


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Есть STM32F303 (discovery 3) и в нем есть SPI slave. С внешнего контроллера (Banana Pi) с SPI мастером и аппаратным управлением SS (slave select) я шлю некие посылки. STM32F303 их прекрасно ловит, читаю функцией spi_receive. Но возникает вопрос - а как на STM32 определить значение линии NSS? Ведь она занята под GPIO_AF_5 и режим работы "SPI_NSS = SPI_NSS_Hard".

Просто хочу как-то определять что посылка началась (мастер потянул NSS и вот приходят байты), и что данный байт был последним и мастер отпустил NSS, причем без использования прерываний.

Не понимаю как в SPI slave при SPI_NSS_Hard смотреть статус этой линии... Все регистры обыскал, нигде этот бит не завалялся...

Код
unsigned char spi_receive()
{
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
    return (unsigned char) SPI_ReceiveData8(SPI2);
}

void init_hw_spi()
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

    GPIO_InitTypeDef spi_gpio;
    GPIO_StructInit(&spi_gpio);

    spi_gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    spi_gpio.GPIO_Mode = GPIO_Mode_AF;
    spi_gpio.GPIO_Speed = GPIO_Speed_50MHz;
    spi_gpio.GPIO_OType = GPIO_OType_PP;
    spi_gpio.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_Init(GPIOB, &spi_gpio);

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_5);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_5);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_5);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_5);

    SPI_I2S_DeInit(SPI2);
    SPI_InitTypeDef spi_port;
    SPI_StructInit(&spi_port);

    spi_port.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    spi_port.SPI_Mode = SPI_Mode_Slave;
    spi_port.SPI_DataSize = SPI_DataSize_8b;
    spi_port.SPI_CPOL = SPI_CPOL_Low;
    spi_port.SPI_CPHA = SPI_CPHA_1Edge;
    spi_port.SPI_NSS = SPI_NSS_Hard;
    spi_port.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init(SPI2, &spi_port);
    SPI_Cmd(SPI2, ENABLE);
}


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 15 2015, 22:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А просто прочитать как GPIO не пробовали?
Go to the top of the page
 
+Quote Post
AVR
сообщение Sep 16 2015, 09:06
Сообщение #3


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(aaarrr @ Sep 16 2015, 01:20) *
А просто прочитать как GPIO не пробовали?

Если честно, то не пробовал. Думаю насчет прерываний, есть ли вообще таковое для событие когда слейву дёргают select, однако если бы было то и флаг в каком-то регистре тоже присутствовал...


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 16 2015, 11:47
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(AVR @ Sep 16 2015, 12:06) *
Если честно, то не пробовал.

Напрасно sm.gif Посмотрите на картинку структуры IO в мануале.
Go to the top of the page
 
+Quote Post
AVR
сообщение Sep 16 2015, 21:29
Сообщение #5


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Шлются посылки от 1 до 10 байт (случайная длина). Вот что получается:
Код
=====
.11 .22 .33 .44 .55 11] .11 .22 .33 .44 .55 .66 .77 88] .11 .22 .33 .11 .22 .33 .44
.55 .66 77] .11 .22 .33 .44 .55 .11 .22 .33 .44 .11 .22 .33 .44 .11 .22 .33 .44 .11
.22 .33 .44 .55 .66 77] .11 .22 .33 .44 .55 .66 .77 .11 .22 .33 .44 .55 .66 77] .11
.22 .33 .44 .55 .11 .22 .33 .44 55] .11 .22 .33 .44 .55 .11 .22 .33 .44 .55 .66 .77
.88 .11 .22 .33 .44 .55 .66 .77 .88 .11 .22 .33 .44 .55 .66 .77 .88 .99 .00 .11 .22
.33 .44 55] .11 .22 .33 .44 .55 .66 .77 .11 .22 .33 .44 .55 .66 77] .11 .22 .33 .44
.55 .66 .77 .88 .99 .11 .22 .33 .44 .55 .66 .77 .88 11] .11 .11 .22 .33 .44 .55 .66
.77 .88 99]

В spi_receive после приема я ловлю статус Slave Select и если он отпущен то знак ] если нет то точка. Видно что тут ".33 .11" последний байт .44] был потерян. Когда теряется последний байт то и статус SS тоже видно что еще активен.

Код
bool spi_receive(unsigned char &data)
{
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
    data = (unsigned char) SPI_ReceiveData8(SPI2);
    delay_1us(3);
    return spi_cs();
}

bool spi_cs()
{
    return (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == RESET);
}

void init_spi()
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

    GPIO_InitTypeDef spi_gpio;
    GPIO_StructInit(&spi_gpio);
    spi_gpio.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    spi_gpio.GPIO_Mode = GPIO_Mode_AF;
    spi_gpio.GPIO_Speed = GPIO_Speed_50MHz;
    spi_gpio.GPIO_OType = GPIO_OType_PP;
    spi_gpio.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_Init(GPIOB, &spi_gpio);
    
    GPIO_StructInit(&spi_gpio);
    spi_gpio.GPIO_Pin = GPIO_Pin_12;
    spi_gpio.GPIO_Mode = GPIO_Mode_IN;
    spi_gpio.GPIO_Speed = GPIO_Speed_50MHz;
    spi_gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &spi_gpio);

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_5);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_5);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_5);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_5);

    SPI_I2S_DeInit(SPI2);
    SPI_InitTypeDef spi_port;
    SPI_StructInit(&spi_port);

    spi_port.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    spi_port.SPI_Mode = SPI_Mode_Slave;
    spi_port.SPI_DataSize = SPI_DataSize_8b;
    spi_port.SPI_CPOL = SPI_CPOL_Low;
    spi_port.SPI_CPHA = SPI_CPHA_1Edge;
    spi_port.SPI_NSS = SPI_NSS_Soft;
    spi_port.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init(SPI2, &spi_port);
    SPI_Cmd(SPI2, ENABLE);
    spi_clear();
}


---------------

Цитата(aaarrr @ Sep 16 2015, 14:47) *
Напрасно sm.gif Посмотрите на картинку структуры IO в мануале.

Спасибо, читается. Однако это плохой признак начала-конца пакета, почему-то иногда теряет байт иногда нет. Но главное что простой тест:
Код
    int test = 0;
    while(true)
    {
        if(spi_cs()) usart_t("|", 1);
        else usart_t(".", 1);
        test++;
        if(test > 50)
        {
            usart_tx("", 0);
            test = 0;
        }
    }

bool spi_cs()
{
    return (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == RESET);
}

показывает четкие chip select-ы.


--------------------
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Sep 20 2015, 12:31
Сообщение #6


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Вот тут https://188.134.5.254/browser/hfreceiver/trunk/spislave.c посмотрите. Хотя под STM32F4xx, может помочь.
Go to the top of the page
 
+Quote Post
ASDFG123
сообщение Mar 8 2016, 08:34
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 165
Регистрация: 2-01-13
Пользователь №: 75 042



Подскажите как правильно написать функцию отправки по SPI на плате VL DIscovery. Мне надо линию FSYNC на пине А4 в ноль, затем отправить 16 бит, затем проверка флага отправки, с ним как раз проблема не совсем понял как правильно проверять видел несколько вариантов через SPI_I2S_FLAG_BSY и SPI_I2S_FLAG_TXE. В конце надо поднять FSYNC в 1. Важный момент чтобы FSYNC не поднялось раньше чем посылка дойдет.
Код
void SPI1_WriteWorld(int Data)
{
    // FSYNC в 0
    GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
    // Отправка данных (16 бит)
  SPI_I2S_SendData(SPI1, Data);
  // Жду пока буфер TX будет пустой
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
    // FSYNC в 1
  GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET);
}
Go to the top of the page
 
+Quote Post

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

 


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


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