找回密码
 立即注册
查看: 1593|回复: 23

STC单片机做为丛机,在SPI通信下第一个数据会丢失?

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-04-29 14:15:11

6

主题

33

回帖

596

积分

高级会员

积分
596
发表于 2024-4-7 18:38:15 | 显示全部楼层 |阅读模式
本帖最后由 虹涛犹珷 于 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不知道怎么来的,似乎是随机的,每次复位后,重发,都是不同的数据。
微信截图_20240407180440.png
第二次发送数据,会把第四个数据0x04放到了第一个位置。然后你多次发送,会保持不变。
微信截图_20240407180836.png
丛机的接收使用的中断接收,程序如下:
void ADC_SPI_ISR() interrupt 5
{
    SPSTAT = 0xC0; //清中断标志
    SPDAT = SPDAT;
}
有没有人遇到相同情况?
规格书上面的时序图,只表明了发送一个数据的情况,如果是连续发送呢?
微信截图_20240407183717.png

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-04-29 14:15:11

6

主题

33

回帖

596

积分

高级会员

积分
596
发表于 2024-4-7 18:43:52 | 显示全部楼层
论坛内几乎都是SPI通信以主机形式,几乎没有作为丛机,想找点资料好难
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-4-7 19:03:34 | 显示全部楼层
SPI本就这样,MOSI发送数据时MISO同时回复数据。
你可在初始化时往SPDAT写入第一个要回复的数据,例如:SPDAT = 0x55;
那么主机发送第一个0x01时,从机就会返回0x55。
接下来如果从机没有修改SPDAT里面的返回值的话,
当主机发送第二个数据0x02时,从机就会返回SPDAT里面存放的从主机接收到的第一个数据0x01。
依此推论,从机当前返回的都是接收到的主机上次发送的数据。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:455
  • 最近打卡:2025-05-01 08:13:06
已绑定手机

27

主题

341

回帖

1687

积分

金牌会员

机长

积分
1687
发表于 2024-4-7 19:07:22 | 显示全部楼层
好歹把关键代码贴出来啊……
编程不是算命,猜不出来……
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-4-7 21:25:25 | 显示全部楼层
STC12H1K16, STC8G/STC8H/STC32 的 SPI 做从机我们都测试过,无问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-04-29 14:15:11

6

主题

33

回帖

596

积分

高级会员

积分
596
发表于 2024-4-8 08:29:54 | 显示全部楼层
hsr*** 发表于 2024-4-7 19:07
好歹把关键代码贴出来啊……
编程不是算命,猜不出来……

程序很简单,我最终的想法是想让单片机作为丛机,充当FLASH芯片,用另外的主机去读丛机里面的数据,就像驱动一块25AA256的FLASH芯片一样。
这是主机的:
t.png

这是丛机的:
r.png


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-04-29 14:15:11

6

主题

33

回帖

596

积分

高级会员

积分
596
发表于 2024-4-8 08:35:56 | 显示全部楼层
神*** 发表于 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
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-04-29 14:15:11

6

主题

33

回帖

596

积分

高级会员

积分
596
发表于 2024-4-8 08:37:10 | 显示全部楼层
神*** 发表于 2024-4-7 21:25
STC12H1K16, STC8G/STC8H/STC32 的 SPI 做从机我们都测试过,无问题

你们的测试,是发送一个数据,还是发送连续的数据过去?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-04-29 14:15:11

6

主题

33

回帖

596

积分

高级会员

积分
596
发表于 2024-4-8 08:41:39 | 显示全部楼层
乘风*** 发表于 2024-4-7 19:03
SPI本就这样,MOSI发送数据时MISO同时回复数据。
你可在初始化时往SPDAT写入第一个要回复的数据,例如:SPD ...

“你可在初始化时往SPDAT写入第一个要回复的数据,例如:SPDAT = 0x55;”
如果丛机不知道第一个数据是什么的情况下该怎么办?我的设想是主机先发送读取命令,再发送16位地址,然后发送一个0xFF,就会读取一个16位地址的数据。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-4-8 09:03:49 | 显示全部楼层
虹涛*** 发表于 2024-4-8 08:41
“你可在初始化时往SPDAT写入第一个要回复的数据,例如:SPDAT = 0x55;”
如果丛机不知道第一个数据是什 ...

从机不知道要发什么数据情况下,可以先发固定数据作为握手信号,主机也可以凭此判定从机是否有正常响应。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 03:55 , Processed in 0.128163 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表