STM32F072RB не получает / не отправляет данные через SPI в ведомом режиме

Я использую STM32F072RB uC для приема и передачи данных через SPI2 в ведомый режим со следующей конфигурацией:

CR1 = 0x0078
CR2 = 0x0700
AFRH = 0x55353500
MODER = 0xa2a0556a

Регистр APB1ENR также правильно настроен.

Текущая программа просто проверяет флаг RXNE, считывает полученные данные из DR и отправляет запись случайного значения в DR.

Регистр состояния, когда я получаю данные, имеет следующее значение:

SR = 0x1403

Мастер отправляет данные правильно, и я проверил сигналы на подчиненных контактах (фаза и полярность тактовых импульсов идентичны с обеих сторон, а сигнал NSS очищается перед отправкой SCK и данных через MOSI).

Я даже настроил контакты как входы, и я знаю, что могу прочитать любой цифровой сигнал, который может послать мастер. В текущей конфигурации кажется, что ведомое устройство что-то получает, потому что RXNE устанавливается, когда ведущее устройство отправляет данные, но считываемое значение всегда равно 0x00.

Я пробовал разные конфигурации (программный / аппаратный NSS, разные размеры данных и т. Д.), Но всегда получаю 0x00. Более того, случайное значение, которое я отправляю после чтения DR, не отправляется на выходы.

Это моя текущая функция, которая вызывается постоянно:

unsigned char spi_rx_slave(unsigned char spiPort, unsigned char *receiveBuffer)
{
    uint8_t temp;
    static unsigned long sr;
    if (!spi_isOpen(spiPort))
    {
        sendDebug("%s() Error: spiPort not in use!\r\n",__func__);
        return false;
    }
    if (spiDescriptor[spiPort]->powerdown == true)
    {
        sendDebug("%s() Error: spiPort in powerdown!\r\n",__func__);
        return false;
    }
    /* wait till spi is not busy anymore */
    while((spiDescriptor[spiPort]->spiBase->SR) & SPI_SR_BSY)
    {
        sendDebug("SPI is busy(1)\r\n");
        vTaskDelay(2);
    }
    sendDebug("CR1 = 0x%04x, ", spiDescriptor[spiPort]->spiBase->CR1);
    sendDebug("CR2 = 0x%04x, ", spiDescriptor[spiPort]->spiBase->CR2);
    sendDebug("AFRH address = 0x%08x, AFRH value = %08x, ", (unsigned long*)(GPIOB_BASE+0x24), *(unsigned long*)(GPIOB_BASE+0x24));
    sendDebug("MODER address = 0x%08x, MODER value = %08x\r\n", (unsigned long*)(GPIOB_BASE), *(unsigned long*)(GPIOB_BASE));
    sr = spiDescriptor[spiPort]->spiBase->SR;
    while(sr & SPI_SR_RXNE)
    {
        /* get RX byte */
        temp = *(uint8_t *)&(spiDescriptor[spiPort]->spiBase->DR);
        spiDescriptor[spiPort]->spiBase->DR = 0x53;
        sendDebug("-------->DR address = 0x%08x, data received: 0x%02x\r\n", &spiDescriptor[spiPort]->spiBase->DR, temp);
        sendDebug("SR = 0x%04x\r\n", sr);
        vTaskDelay(1);
        sr = spiDescriptor[spiPort]->spiBase->SR;
    }
    while((spiDescriptor[spiPort]->spiBase->SR) & SPI_SR_BSY)
    {
        sendDebug("SPI is busy(2)\r\n");
        vTaskDelay(2);
    }
    return true;
}

Что я делаю неправильно? Есть ли что-нибудь, что я неправильно настроил?

Заранее спасибо. С уважением, Хавьер

Редактировать:

Я переключился на программное обеспечение NSS и скопировал значения регистров из примера STM32CubeMX, который я нашел в Интернете. Я не могу использовать эти библиотеки для этого проекта, но хотел бы иметь такое же поведение.

Новые значения:

CR1 = 0x0278

что значит

  • fPCLK / 256 (правильный для скорости связи),
  • SPI включен и
  • SSM = 1 (программное обеспечение NSS).
CR2 = 0x1700

что значит

  • 8-битные данные и
  • RXNE событие генерируется, если уровень FIFO больше или равен 1/4 (8 бит).
AFRH = 0x55303500
MODER = 0xa8a1556a

что значит

  • Альтернативная функция MISO, MOSI и SCK 5 (SPI2)
  • NSS не настроен, потому что сейчас он находится в программном режиме (всегда выбирается ведомый).

Я по-прежнему получаю те же результаты, и пакет eval с этими библиотеками отлично работает, используя вместо этого SPI1. Следовательно, должна быть другая проблема, не имеющая ничего общего со значениями регистров.

Может быть какая-то проблема с часами, например булавки нужны, чтобы получить часы?

Спасибо!


person Javiku    schedule 21.06.2017    source источник
comment
CR1 = 0x0078, CR2 = 0x0700, AFRH = 0x55353500, MODER = 0xa2a0556a Прежде всего сделайте свой вопрос и конфигурацию удобочитаемыми. Уважайте наше время.   -  person 0___________    schedule 21.06.2017
comment
Ваш мастер генерирует часы. В противном случае вы ничего не отправите. Вам нужно преобразовать DR в байт, если вы хотите отправить байт.   -  person 0___________    schedule 21.06.2017
comment
Да, мастер правильно генерирует часы, и получение этих часов заставляет SPI активировать флаг RXNE.   -  person Javiku    schedule 23.06.2017
comment
Я подумал, что наличие значений регистров будет полезно для всех, кто захочет помочь. Должен ли я просто объяснить, что означает каждый бит в каждом регистре? Спасибо.   -  person Javiku    schedule 23.06.2017
comment
Я отредактировал вопрос, чтобы предоставить некоторую информацию, которую другие сочли недостающей. Не существует микроконтроллера с именем STM32072RB, а есть только STM32F072RB * и STM32L072RB (с F или с L, соответственно). Используя только информацию, приведенную в вопросе и ответе, я сначала подумал, что могли иметь в виду оба контроллера. Однако только в F0 регистр SPI_CR2 занимает более 8 бит, а SPI_SR предоставляет более 9 бит, поэтому, должно быть, имелся в виду STM32F072RB. = ›Отредактировал заголовок и теги соответственно.   -  person HelpingHand    schedule 30.05.2020


Ответы (1)


Вопрос указывает на пару ошибок, которые могут объяснить, почему не наблюдалось приема:

  1. # P2 #
    AFRH = 0x55303500
    MODER = 0xa8a1556a
    
    # P3 #
    PB15 - Alternate Function - AF5 = [INVALID]
    PB14 - Alternate Function - AF5 = [I2C2_SDA]
    PB13 - Alternate Function - AF3 = [TSC_G6_IO3]
    PB12 - GP Input (reset state)
    PB11 - Alternate Function - AF3 = [TIM_CH4]
    PB10 - Alternate Function - AF5 = [SPI2_SCK / I2S2_CK]
    PB09 - GP Input (reset state)
    PB08 - GP Output
    PB07 - Alternate Function - (unknown which, see register AFRL)
    PB06 - GP Output
    PB05 - Alternate Function - (unknown which, see register AFRL)
    PB04 - GP Output
    PB03 - GP Output
    PB02 - Alternate Function - (unknown which, see register AFRL)
    PB01 - Alternate Function - (unknown which, see register AFRL)
    PB00 - Alternate Function - (unknown which, see register AFRL)
    
    # P4 # # P5 # # P6 #
  2. # P7 #
    # P8 #
    # P9 # # P10 #
  3. # P11 #
    # P12 #
    # P13 #
person HelpingHand    schedule 30.05.2020