Other Parts Discussed in Thread: F28M36P63C2
您好!
我正在尝试将 F28M36P63C2中的 C28配置为 I2C 主发送器、以向 DAC 发送地址和两个字节。 我可以看到随示波器发送的地址、但不能看到其余字节、有什么原因?
我正在执行以下操作:
1.使用以下命令初始化 I2C 模块:
空 I2CA_Init (空)
{
I2caRegs.I2CPSC.all = 14;//对于 CPU_FRQ_150MHz、SYSCLK/(I2CPSC+1)
I2caRegs.I2CCLKL = 45; //SCL 100kHz 50%占空比
I2caRegs.I2CCLKH = 45; //SCL 100kHz 50%占空比
I2caRegs.I2CMDR.ALL = 0x0020; //使 I2C 退出复位
DELAY_c28 (); //在使模块退出复位后延迟大约为10ms
返回;
}
2.在上面的初始化之后,我按如下方式执行单次传输:
void I2C_write_new_nofifo()
{
uint16 i = 0;
while (I2cRegs.I2CSTR.bit.BB = 1){}
//设置从地址
I2caRegs.I2CSAR = 0x60; //由我的 DAC 指定的地址
I2caRegs.I2CCNT = 2; //在地址字节后发送两个字节、地址为7位
I2caRegs.I2CMDR.bit.TRX = 1; //设置为发送模式
I2caRegs.I2CMDR.bit.STP= 1; //一旦 Tx 完成,即 I2CCNT =0,主器件必须释放总线
I2caRegs.I2CMDR.bit.MST = 1; //设置为主模式
I2caRegs.I2CMDR.bit.FREE = 1; //调试器不会在断点上停止总线
I2caRegs.I2CMDR.bit.STT = 1; //发送起始位、传输将跟随
for (i=0;i<2;i++)//发送两个字节
{
while (I2cRegs.I2CSTR.bit.XRDY = 0){};//在 XSR 寄存器准备就绪前不执行任何操作
I2caRegs.I2CDXR = 0x05;///Next 数据字节、只是一个虚拟0x05
}
delay_c28();
}
之后、CPU 保持在一个永久循环中。 因此、在运行该代码并暂停 CPU 之后、光标将保持在此行中:
while (I2cRegs.I2CSTR.bit.XRDY = 0){};//在 XSR 寄存器准备就绪前不执行任何操作:
我=1、这意味着它显然会发送第一个字节、但我在使用示波器时只会看到地址字节以及首次传输的 R/W 和 ACK、但之后不会发送0x05字节、这似乎是模块卡住了、无法传输更多数据。 为什么会这样?、任何帮助都非常感谢。
谢谢你