首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32H7 SPI通信: FIFO管理问题

STM32H7 SPI通信: FIFO管理问题
EN

Stack Overflow用户
提问于 2020-06-08 10:37:54
回答 1查看 2.6K关注 0票数 2

我已经为我的SPI设置挣扎了很长一段时间。

设置如下:

  • SPI从机是一种单模核STM32H743,最大时钟(sysclk 400 etc,hclck 200 etc,APB时钟100 etc)
  • SPI母机是另一个相同的核单模核,时钟除以2: sysclk 200 etc等.spi_ker_clk =100 SPI
  • SPI主电路,预分频器为16 ie。时钟SPI约6 6MHz。已启用CRC。数据帧8位。FIFO阈值4字节
  • SPI从: CRC启用,8位。FIFO阈值4字节

没有控制从服务器的从选择信号。

这是主人的代码。在投票中所做的一切,我增加了一些延迟,让奴隶有时间去工作。下面的函数在循环中调用,主程序(在我用于调试的这个简化版本中)不执行其他操作:

代码语言:javascript
复制
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个字节的答复。

代码语言:javascript
复制
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。

乍一看,人们可能会说,太慢而遗漏了一些字节的只是奴隶,但奇怪的是:

  • I得到一个RXP中断,这意味着从服务器在4个字节内正确地检测到了SPI时钟,并对4个字节进行了采样,
  • 没有CRC错误,这意味着从服务器接收了正确的位。例如,当我从FIFO读取56341200时,RXCRC是0x08,这是完整帧78 56 34 12

的CRC。

似乎在读取FIFO时出现了问题。

我用过逻辑分析仪,没有发现任何电气问题。

在从服务器端的寄存器值,在错误接收期间(更准确地说,我在SPI中断处理程序中中断)如下。在这件事上,我读到了34 12 00:

(TSIZE)

  • CFG1:
  • CR1=1 (SPE)
  • CR2= 4 MBR 0x07,CRCEN,UDRCFG=2,FTHVL=3,DSIZE=7
  • CFG2: SSM=1,COMM=2
  • IER=1(RXPIE)
  • SR=0x0001300A ie.CTSIZE=1 (奇怪但参考手册上说,“在总线上流量持续时,值不是很可靠”),RXPLVL=1 (??),EOT=1 (预期),TXP=1 TXP=1(期望一个完整的帧)。值得一说的是调试器(Keil)没有正确地读取寄存器,我是在我的代码中读到的。

CTSIZE和RXPLVL的值并不完全一致(至少我不理解它们):因为FTHVL=3 (4-data)和TSIZE=4 (在主端相同),当我得到RXP事件时,我应该至少收到4个字节。我看不出CTSIZE是如何成为1的,也不知道为什么FIFO (RXPLVL=1)中会留下另一个字节。

有什么想法或建议吗?

EN

回答 1

Stack Overflow用户

发布于 2020-10-26 19:04:07

我建议将sysclock速度降低到250 MHz以下,并进行测试。在我的开发过程中,我遇到了一些SPI通信问题,这与我的速度直接相关。我相信当速度超过250 MHz时,在微系统中有一个错误,它会丢失SPI数据包。我的微控制器是H750VBT6。希望这能帮上忙。向你问好,恩里克·巴索。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62260154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档