【问题标题】:C SPI latch pulse happening too soonC SPI 锁存脉冲发生得太快
【发布时间】:2015-08-16 22:27:25
【问题描述】:

我正在尝试使用 9s12 连接 2 个 MAX7219 驱动程序。 我的问题是,当我发送数据时,锁存脉冲发生在 SPI 传输完成之前。 http://imgur.com/BGd1sB9

附图显示了 SPI 时钟和数据仍在发送时发生的脉冲。

void MAX7219Init(void)
{
    INT8U count =0;

    setLow(PORTP, PIN6);    /* Need to set low on startup */
    for (count = 1; count <= 2; count++){ //Run twice to send data to 2 max7219
        spimx(0x0F, 0xCD); 
    }
    pulse(PORTP, PIN6);

    while (1) ;

}

void spimx(INT8U address, INT8U data)
{
   
    while((SPI0SR & SPTEF) == 0){} /*Wait for previous transmit */
    SPI0DR = (INT8U)(address & 0b00001111);                /*Initiate a transfer */
    while((SPI0SR & SPIF) == 0){}  /*Wait for new data */

 
    while((SPI0SR & SPTEF) == 0){} /*Wait for previous transmit */
    SPI0DR = data;                /*Initiate a transfer */
    while((SPI0SR & SPIF) == 0){}  /*Wait for new data */
 
}

什么可能导致这个脉搏过早? 我希望我的问题是有道理的。 谢谢

【问题讨论】:

  • 我想你在别处初始化了 SPI?实际上,我认为这也属于这里。此外,您可能想了解stdint.h。这个头提供了 8 位无符号和类似数据类型的标准名称,每个人应该都能理解。您使用的 ae 名称在某种程度上是 C99 标准之前的遗留物。

标签: c spi


【解决方案1】:

在您发送脉冲的那一刻,SPI 仍在传输数据。您必须等到 SPI 完成 所有 未决传输,而不仅仅是等待传输缓冲区为空(我想 SPI 是双缓冲的:tx 缓冲区加移位寄存器,这很常见)。

因此,任一 SPI 模块都有一个状态位,表示“传输完成”(在 STM32 上,这称为“忙”,SPI 上的信号相反)。或者,如果没有这样的标志,您应该使用计时器来等待经过适当数量的时钟。 (根据 SPI 时钟和每次传输的位数,将最后一个字发送到 SPI 后启动定时器,超时值 >= 传输持续时间)。

好的,我仔细看了看,实际上没有“完成/忙碌/空闲标志。所以我们必须等待使用接收标志传输的每个字节(见下文)

void spimx(INT8U address, INT8U data)
{
    SPI0DR = (INT8U)(address & 0b00001111); // send address
    while ( !(SPI0SR & SPIF) ) ;            // Wait until shifted
    SPI0DR;                                 // explaination below
    SPI0DR = data;                          // send data
    while ( !(SPI0SR & SPIF) ) ;            // Wait until shifted
    SPI0DR;                                 // explaination below
    // here the SPI is idle
}

由于 SPI 的双向特性,如果已接收到数据,则存储的字节也已发送。所以实际上不需要测试 SPTEF。一开始,也不需要,因为 SPI 从上次调用开始就为空(请参阅下面的警告)。

要清除 SPIIF 标志,我们必须读取数据寄存器。由于我们不需要数据,我们只需将其删除(dummy read)。否则,标志将永远保持设置,等待循环将立即终止。这将导致完全显示的行为。

注意初始化后不要使用其他函数写入 SPI。否则必须符合相同的程序。

【讨论】:

  • 是的,对不起。我不知道我是否应该在这里感谢你。我确实没有照顾 SPI 的接收部分。
  • @Kronix:你实际上不应该。我只是好奇而已。我目前使用 ARM,这么小的 CPU 有点令人耳目一新(我没有使用过 S12),让我想起了更轻松的日子:-)。很高兴我能帮上忙。
猜你喜欢
  • 2022-01-12
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多