为什么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). 但就是运行结果不正确。
实际上,当我把
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错误,但运行也是不正确的(无法唤醒芯片)。我试过了才知道,从第一条指令就是没有正确运行。
为啥还在审核啊...... 是不是你没有重新导入头文件? 我刚刚换了一个新版本的AiCube,然后就好了。搞不懂,貌似生成的时候选错了处理器。 zhouqiming 发表于 2025-7-12 14:05
我刚刚换了一个新版本的AiCube,然后就好了。搞不懂,貌似生成的时候选错了处理器。 ...
时刻保持最新版本
长时间未更新的还要重新添加一下头文件和仿真器驱动
https://www.stcaimcu.com/data/download/Tools/AiCube-ISP-v6.95Y.zip E 学习了学习了
页:
[1]