zhouqiming 发表于 2025-7-11 23:37:58

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

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). 但就是运行结果不正确。

zhouqiming 发表于 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错误,但运行也是不正确的(无法唤醒芯片)。我试过了才知道,从第一条指令就是没有正确运行。

zhouqiming 发表于 2025-7-12 10:49:47

为啥还在审核啊......

jwd 发表于 2025-7-12 13:37:56

是不是你没有重新导入头文件?

zhouqiming 发表于 2025-7-12 14:05:26

我刚刚换了一个新版本的AiCube,然后就好了。搞不懂,貌似生成的时候选错了处理器。

DebugLab 发表于 2025-7-12 14:53:09

zhouqiming 发表于 2025-7-12 14:05
我刚刚换了一个新版本的AiCube,然后就好了。搞不懂,貌似生成的时候选错了处理器。 ...

时刻保持最新版本
长时间未更新的还要重新添加一下头文件和仿真器驱动
https://www.stcaimcu.com/data/download/Tools/AiCube-ISP-v6.95Y.zip

zhaoyun189911 发表于 2025-7-28 00:15:48

E   学习了学习了
页: [1]
查看完整版本: 为什么Start()可以,而I2C_MasterStart()不可以