STC单片机做为丛机,在SPI通信下第一个数据会丢失?
本帖最后由 虹涛犹珷 于 2024-4-7 18:39 编辑我用2块STC12系列的单片机进行数据交换,主机发送正常,就是丛机会丢第一个数据。
这是我主机发送的程序:
SPI1_SS_RESET;
SPI1_TransmitReceiveByte(0x01);
SPI1_TransmitReceiveByte(0x02);
SPI1_TransmitReceiveByte(0x03);
SPI1_TransmitReceiveByte(0x04);
SPI1_SS_SET;
一共发送了4个数据。
这是逻辑分析仪下的波形:
第一次发送数据,第一个数据0x08不知道怎么来的,似乎是随机的,每次复位后,重发,都是不同的数据。
第二次发送数据,会把第四个数据0x04放到了第一个位置。然后你多次发送,会保持不变。
丛机的接收使用的中断接收,程序如下:
void ADC_SPI_ISR() interrupt 5
{
SPSTAT = 0xC0; //清中断标志
SPDAT = SPDAT;
}
有没有人遇到相同情况?
规格书上面的时序图,只表明了发送一个数据的情况,如果是连续发送呢?
论坛内几乎都是SPI通信以主机形式,几乎没有作为丛机,想找点资料好难{:cry:} SPI本就这样,MOSI发送数据时MISO同时回复数据。
你可在初始化时往SPDAT写入第一个要回复的数据,例如:SPDAT = 0x55;
那么主机发送第一个0x01时,从机就会返回0x55。
接下来如果从机没有修改SPDAT里面的返回值的话,
当主机发送第二个数据0x02时,从机就会返回SPDAT里面存放的从主机接收到的第一个数据0x01。
依此推论,从机当前返回的都是接收到的主机上次发送的数据。
好歹把关键代码贴出来啊……
编程不是算命,猜不出来…… STC12H1K16, STC8G/STC8H/STC32 的 SPI 做从机我们都测试过,无问题 hsrzq 发表于 2024-4-7 19:07
好歹把关键代码贴出来啊……
编程不是算命,猜不出来……
程序很简单,我最终的想法是想让单片机作为丛机,充当FLASH芯片,用另外的主机去读丛机里面的数据,就像驱动一块25AA256的FLASH芯片一样。
这是主机的:
这是丛机的:
神农鼎 发表于 2024-4-7 21:25
STC12H1K16, STC8G/STC8H/STC32 的 SPI 做从机我们都测试过,无问题
STC以丛机的方式,可以模拟出FLASH芯片吗?
主机可以像这样去读数据:
/**********************************************************
函数结果:IC1_25AA256_TransmitReceive
备注:读出数据
**********************************************************/
void IC1_25AA256_TransmitReceive(uint16_t addr,uint8_t *pData,uint16_t length)
{
IC1_25AA256_CS_RESET; //START
SPI1_TransmitReceiveByte(IC_25AA256_READ); //写入指令
SPI1_TransmitReceiveByte((uint8_t)(addr>>8)); //写入指定地址
SPI1_TransmitReceiveByte((uint8_t)(addr & 0x00FF));
while (length > 0U)
{
length--;
*pData ++ = SPI1_TransmitReceiveByte(0xFF); //读出数据
}
IC1_25AA256_CS_SET;//STOP
} 神农鼎 发表于 2024-4-7 21:25
STC12H1K16, STC8G/STC8H/STC32 的 SPI 做从机我们都测试过,无问题
你们的测试,是发送一个数据,还是发送连续的数据过去? 乘风飞扬 发表于 2024-4-7 19:03
SPI本就这样,MOSI发送数据时MISO同时回复数据。
你可在初始化时往SPDAT写入第一个要回复的数据,例如:SPD ...
“你可在初始化时往SPDAT写入第一个要回复的数据,例如:SPDAT = 0x55;”
如果丛机不知道第一个数据是什么的情况下该怎么办?我的设想是主机先发送读取命令,再发送16位地址,然后发送一个0xFF,就会读取一个16位地址的数据。 虹涛犹珷 发表于 2024-4-8 08:41
“你可在初始化时往SPDAT写入第一个要回复的数据,例如:SPDAT = 0x55;”
如果丛机不知道第一个数据是什 ...
从机不知道要发什么数据情况下,可以先发固定数据作为握手信号,主机也可以凭此判定从机是否有正常响应。