请教工程师i2c问题

老师您好,我用ch582m 用app_i2c库函数,现在有个问题要请教一下,我要系统平时处于从接收状态,串口收到数据后转换成主发送状态,发送结束后马上转换成从接收状态,我正常初始化以后可以接收数据,切换主发送的时候先执行i2c_app_init然后执行i2c_write_to(SLAVE_ADDR >> 1, TxData, sizeof(TxData), true, true);,发送结束后执行i2c_app_init从新初始化从接收模式,可以正常使用,但是在数据快速发送的时候,用逻辑分析仪看,就会和外接i2c设备同时处于主机发送状态而导致通讯出错,请问老师我是哪里弄错了,是不是主机从机切换的方法不对?请问老师有没有更详细点的例程或者说明,谢谢

没有切换使用硬件IIC主从机的参考代码。IIC总线上不能够有两个主机同时发送,会出现总线仲裁错误,确定一下同一时刻是否只有一个主机接管总线。


请问老师,主发送切换到从接收需要怎么操作,我现在可以在主发送下连续发送数据没有问题,在从接收下,连续接收数据也没有问题,但是在主发送到从接收切换得时候,就是发送完数据马上转换到从接收状态时就会有大概3秒钟得延迟状态,请问是哪里没弄对,代码如下,麻烦老师给指点一下,谢谢

以下是主发送程序

while(I2C_GetFlagStatus(I2C_FLAG_BUSY) != RESET);

I2C_Init(I2C_Mode_I2C, 400000, I2C_DutyCycle_16_9, I2C_Ack_Enable,

I2C_AckAddr_7bit, address<<1);

I2C_StretchClockCmd(ENABLE);//时钟延长

I2C_Cmd(ENABLE);//开启i2c外设

I2C_GenerateSTART(ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(address<<1, I2C_Direction_Transmitter);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

while(i < len)

{

if(I2C_GetFlagStatus(I2C_FLAG_TXE) != RESET)

{

I2C_SendData(txdata[i]);

i++;

}

}


while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));


I2C_GenerateSTOP(ENABLE);

I2C_Cmd(DISABLE);

}

i2c_rec_init(SLAVE_ADDR);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

以下是初始化从接收程序

void i2c_rec_init(uint8_t address)

{

I2C_Init(I2C_Mode_I2C, 400000, I2C_DutyCycle_16_9, I2C_Ack_Enable,

I2C_AckAddr_7bit, address<<1);

I2C_StretchClockCmd(ENABLE);//时钟延长

I2C_Cmd(ENABLE);//开启i2c外设

I2C_ITConfig(I2C_IT_BUF, ENABLE);

I2C_ITConfig(I2C_IT_EVT, ENABLE);

I2C_ITConfig(I2C_IT_ERR, ENABLE);

PFIC_EnableIRQ(I2C_IRQn);


}



请问老师在报告仲裁丢失以后,系统好像跑飞了,虽然还能进i2c中断,也能打印输出,但是不在主循环里面了,请问老师这个要怎么回事?


按照你这个需求需要主从机之间协议约束好,两边切换状态的时间要同步。或者主机端使用软件模拟iic。模拟I2C主机(CH579 CH573 CH582) - debugdabiaoge - 博客园 (cnblogs.com)


感谢老师解答,我这个是作为指令翻译器使用的,其他有3个设备都是主从机自动切换的,而且其他3个设备是不能改变的,都是其他厂家的东西,因为需要仲裁,所以还不能用模拟i2c,只能使用硬件i2c,现在遇到的问题是报告仲裁丢失以后程序就跑飞了,脱离主循环了,请问老师这个大概是什么原因?


加打印看一下是否是卡在某个中断里面没有退出,确认已经清除中断标志位。


只有登录才能回复,可以选择微信账号登录