我正在使用
STM32F072RB
uC 在从模式下接收和传输数据,SPI2
配置如下:
CR1 = 0x0078
CR2 = 0x0700
AFRH = 0x55353500
MODER = 0xa2a0556a
该寄存器APB1ENR
也已正确配置。
当前程序只是检查RXNE
标志,从中读取接收到的数据DR
并将随机值写入DR
.
我接收数据时的状态寄存器具有以下值:
SR = 0x1403
主机正确发送数据,我检查了从机引脚的信号(两侧的时钟相位和极性相同,NSS 信号在通过 MOSI 发送 SCK 和数据之前被清除)。
我什至将引脚配置为输入,我知道我可以读取主机可以发送的任何数字信号。在当前配置下,slave 似乎收到了一些东西,因为RXNE
在 master 发送数据时设置了它,但读取的值始终为 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 未配置,因为现在它处于软件模式(始终选择从站)。
我仍然得到相同的结果,并且带有这些库的评估套件可以正常使用SPI1
。因此,肯定还有另一个与寄存器值无关的问题。
可能有任何时钟问题,例如引脚需要获得一些时钟吗?
谢谢!