找回密码
 立即注册
查看: 109|回复: 5

为什么Start()可以,而I2C_MasterStart()不可以

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-07-12 08:20:18
已绑定手机

5

主题

11

回帖

109

积分

注册会员

积分
109
发表于 2025-7-11 23:37:58 | 显示全部楼层 |阅读模式
Start()是老的Ai8051U的I2C库函数
/////////////////////////////////////////////////////////////////////////
void Start()
{
        I2CMSCR = 0x01;                         //发送START命令
        Wait();
}
其中
void Wait()
{
        while (!(I2CMSST & 0x40));
        I2CMSST &= ~0x40;
}
/////////////////////////////////////////////////////////////////////
I2C_MasterStart()是使用AiCube生成的库函数

void I2C_MasterStart(void)
{
    I2C_Start();                        //触发主机模式起始命令
    I2C_MasterWait();                   //等待命令完成
}

其中
#define I2CCMD_START                    1
#define BIT_LN                  0x0f
#define I2CMSCR_MSCMD_MSK               (BIT_LN)
#define MODIFY_REG(r, clr, set) ((r) = (((r) & ~(clr)) | ((set) & (clr))))
#define I2C_SetMasterCommand(n)         MODIFY_REG(I2CMSCR, I2CMSCR_MSCMD_MSK, ((n) << 0))
#define I2C_Start()                     I2C_SetMasterCommand(I2CCMD_START)
所以I2C_Start()应该也是I2CMSCR = 0x01;
///////////////////////////////////////////////////////////////////////////////////


void I2C_MasterWait(void)
{
    while (!I2C_CheckMasterFlag());     //等待完成标志
    I2C_ClearMasterFlag();              //清除完成标志
    I2C_Idle();                         //恢复IDLE状态
}

其实跟Wait()是一样的
////////////////////////////////////////////////////////////////////////////////
用I2C_MasterStart()替换Start()后,其他都没变,编译结果都是 0 Error(s), 0 Warning(s). 但就是运行结果不正确。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-07-12 08:20:18
已绑定手机

5

主题

11

回帖

109

积分

注册会员

积分
109
发表于 2025-7-11 23:53:46 | 显示全部楼层
实际上,当我把
void Si4844_Powerup(void)
{
        Start();  
        SendData(SI_ADDRESS);  
        RecvACK();
        SendData(SI_POWER_UP);
        RecvACK();
        SendData(0x80);
        RecvACK();
        Stop();                                 //发送停止命令
}
换成
void Si4844_Powerup(void)
{
        I2C_MasterStart();
        I2C_MasterSendByte(SI_ADDRESS);                     //发送设备地址+写命令
        I2C_MasterSendByte(SI_POWER_UP);                     //发送存储地址
        I2C_MasterSendByte(0x80);
        I2C_Stop();  
}
程序也是编译0警告0错误,但运行也是不正确的(无法唤醒芯片)。我试过了才知道,从第一条指令就是没有正确运行。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-07-12 08:20:18
已绑定手机

5

主题

11

回帖

109

积分

注册会员

积分
109
发表于 2025-7-12 10:49:47 | 显示全部楼层
为啥还在审核啊......
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:610
  • 最近打卡:2025-08-01 12:26:36
已绑定手机

54

主题

1875

回帖

3444

积分

论坛元老

积分
3444
发表于 2025-7-12 13:37:56 | 显示全部楼层
是不是你没有重新导入头文件?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-07-12 08:20:18
已绑定手机

5

主题

11

回帖

109

积分

注册会员

积分
109
发表于 2025-7-12 14:05:26 | 显示全部楼层
我刚刚换了一个新版本的AiCube,然后就好了。搞不懂,貌似生成的时候选错了处理器。

点评

时刻保持最新版本 长时间未更新的还要重新添加一下头文件和仿真器驱动 https://www.stcaimcu.com/data/download/Tools/AiCube-ISP-v6.95Y.zip  详情 回复 发表于 2025-7-12 14:53
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:514
  • 最近打卡:2025-08-01 07:33:38
已绑定手机

87

主题

5786

回帖

1万

积分

超级版主

DebugLab

积分
10388
发表于 2025-7-12 14:53:09 | 显示全部楼层
zhouq*** 发表于 2025-7-12 14:05
我刚刚换了一个新版本的AiCube,然后就好了。搞不懂,貌似生成的时候选错了处理器。 ...

时刻保持最新版本
长时间未更新的还要重新添加一下头文件和仿真器驱动
https://www.stcaimcu.com/data/do ... Cube-ISP-v6.95Y.zip
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:125
  • 最近打卡:2025-07-30 21:35:33

5

主题

30

回帖

41

积分

新手上路

积分
41
发表于 4 天前
E   学习了学习了
支持 反对

送花

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

本版积分规则

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

GMT+8, 2025-8-1 15:32 , Processed in 0.118507 second(s), 87 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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