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

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

[复制链接]
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    6

    主题

    33

    回帖

    392

    积分

    中级会员

    积分
    392
    发表于 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

    回复 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    6

    主题

    33

    回帖

    392

    积分

    中级会员

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:59
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1343

    回帖

    4187

    积分

    论坛元老

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 11:10
  • 签到天数: 133 天

    [LV.7]常住居民III

    8

    主题

    79

    回帖

    1092

    积分

    金牌会员

    机长

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

    使用道具 举报

    该用户从未签到

    552

    主题

    9492

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    6

    主题

    33

    回帖

    392

    积分

    中级会员

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

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

    这是丛机的:
    r.png


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    6

    主题

    33

    回帖

    392

    积分

    中级会员

    积分
    392
     楼主| 发表于 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
    }
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    6

    主题

    33

    回帖

    392

    积分

    中级会员

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

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

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    6

    主题

    33

    回帖

    392

    积分

    中级会员

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:59
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1343

    回帖

    4187

    积分

    论坛元老

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-18 06:11 , Processed in 0.069738 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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