gpt4 book ai didi

C SPI 锁存脉冲发生得太快

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:51 24 4
gpt4 key购买 nike

我正在尝试使用 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 仍在传输数据。您必须等到 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 标志,我们必须读取数据寄存器。因为我们不需要数据,所以我们将其丢弃(虚拟读取)。否则,该标志将永远保持设置状态,等待循环将立即终止。这将导致所显示的行为。

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

关于C SPI 锁存脉冲发生得太快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30607772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com