Я использую 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
. Следовательно, должна быть другая проблема, не имеющая ничего общего со значениями регистров.
Может быть какая-то проблема с часами, например булавки нужны, чтобы получить часы?
Спасибо!
SPI_CR2
занимает более 8 бит, аSPI_SR
предоставляет более 9 бит, поэтому, должно быть, имелся в виду STM32F072RB. = ›Отредактировал заголовок и теги соответственно. - person HelpingHand   schedule 30.05.2020