我已经为我的SPI设置挣扎了很长一段时间。
设置如下:
没有控制从服务器的从选择信号。
这是主人的代码。在投票中所做的一切,我增加了一些延迟,让奴隶有时间去工作。下面的函数在循环中调用,主程序(在我用于调试的这个简化版本中)不执行其他操作:
uint32_t SPI_EnvoiCommandeTest(void)
{
uint32_t resp;
uint8_t statut;
SPI1->CFG2 |= SPI_CFG2_COMM_0;
SPI1->CFG2 &= ~SPI_CFG2_COMM_1;
SPI1->CR2 = 4;
SPI1->CR1 |= SPI_CR1_SPE;
SPI1->CR1 |= SPI_CR1_CSTART;
SPI1->TXDR = 0x12345678;
while ( (SPI1->SR & SPI_SR_EOT) == 0 );
if ( (SPI1->SR & SPI_SR_ERR_MASK) != 0 )
{
return ( SPI1->SR & SPI_SR_ERR_MASK);
}
SPI1->IFCR = 0xFFFFFFFF;
SPI1->CR1 &= ~SPI_CR1_SPE;
Delay(1000);
SPI1->CFG2 |= SPI_CFG2_COMM_1;
SPI1->CFG2 &= ~SPI_CFG2_COMM_0;
SPI1->CR2 = 5;
SPI1->CR1 |= SPI_CR1_SPE;
SPI1->CR1 |= SPI_CR1_CSTART;
while ( (SPI1->SR & SPI_SR_EOT) == 0 );
resp = SPI1->RXDR;
statut = *((__IO octet *)&(SPI1->RXDR));
if ( resp != 0x9ABCDEFF)
while(1);
if ( statut != 0x77)
while(1);
while ( (SPI1->SR & SPI_SR_EOT) == 0 );
if ( (SPI1->SR & SPI_SR_ERR_MASK) != 0 )
{
return ( SPI1->SR & SPI_SR_ERR_MASK);
}
SPI1->IFCR = 0xFFFFFFFF;
SPI1->CR1 &= ~SPI_CR1_SPE;
Delay(1000);
return 0;
}对于奴隶,接收是由中断处理程序完成的。主线程只是等待设置一个标志(由SPI_StopReception()设置)并发送5个字节的答复。
static void SPI_GenericHandler(SpiId_e SpiId)
{
SPI_TypeDef *Spi = SpiMgt[SpiId].SpiInstance;
uint32_t trigger = Spi->IER & Spi->SR;
uint32_t cmd;
uint8_t stat;
if (trigger & SPI_SR_RXP)
{
cmd = Spi->RXDR;
if (cmd != 0x12345678)
while(1);
while((Spi->SR & SPI_SR_EOT) == 0);
if (Spi->SR & SPI_SR_CRCE)
while(1);
SPI_StopReception(SpiId);
}
}
(...)我的问题如下。
通信正在正常工作数十万次,然后在从服务器端失败:我不是从SPI FIFO读取字节78 56 34 12,而是读取例如34 12 00或56 34 12 00。
乍一看,人们可能会说,太慢而遗漏了一些字节的只是奴隶,但奇怪的是:
的CRC。
似乎在读取FIFO时出现了问题。
我用过逻辑分析仪,没有发现任何电气问题。
在从服务器端的寄存器值,在错误接收期间(更准确地说,我在SPI中断处理程序中中断)如下。在这件事上,我读到了34 12 00:
(TSIZE)
CTSIZE和RXPLVL的值并不完全一致(至少我不理解它们):因为FTHVL=3 (4-data)和TSIZE=4 (在主端相同),当我得到RXP事件时,我应该至少收到4个字节。我看不出CTSIZE是如何成为1的,也不知道为什么FIFO (RXPLVL=1)中会留下另一个字节。
有什么想法或建议吗?
发布于 2020-10-26 19:04:07
我建议将sysclock速度降低到250 MHz以下,并进行测试。在我的开发过程中,我遇到了一些SPI通信问题,这与我的速度直接相关。我相信当速度超过250 MHz时,在微系统中有一个错误,它会丢失SPI数据包。我的微控制器是H750VBT6。希望这能帮上忙。向你问好,恩里克·巴索。
https://stackoverflow.com/questions/62260154
复制相似问题