老師您好,我用ch582m 用app_i2c庫函數(shù),現(xiàn)在有個問題要請教一下,我要系統(tǒng)平時處于從接收狀態(tài),串口收到數(shù)據(jù)后轉(zhuǎn)換成主發(fā)送狀態(tài),發(fā)送結(jié)束后馬上轉(zhuǎn)換成從接收狀態(tài),我正常初始化以后可以接收數(shù)據(jù),切換主發(fā)送的時候先執(zhí)行i2c_app_init然后執(zhí)行i2c_write_to(SLAVE_ADDR >> 1, TxData, sizeof(TxData), true, true);,發(fā)送結(jié)束后執(zhí)行i2c_app_init從新初始化從接收模式,可以正常使用,但是在數(shù)據(jù)快速發(fā)送的時候,用邏輯分析儀看,就會和外接i2c設(shè)備同時處于主機(jī)發(fā)送狀態(tài)而導(dǎo)致通訊出錯,請問老師我是哪里弄錯了,是不是主機(jī)從機(jī)切換的方法不對?請問老師有沒有更詳細(xì)點(diǎn)的例程或者說明,謝謝
沒有切換使用硬件IIC主從機(jī)的參考代碼。IIC總線上不能夠有兩個主機(jī)同時發(fā)送,會出現(xiàn)總線仲裁錯誤,確定一下同一時刻是否只有一個主機(jī)接管總線。
請問老師,主發(fā)送切換到從接收需要怎么操作,我現(xiàn)在可以在主發(fā)送下連續(xù)發(fā)送數(shù)據(jù)沒有問題,在從接收下,連續(xù)接收數(shù)據(jù)也沒有問題,但是在主發(fā)送到從接收切換得時候,就是發(fā)送完數(shù)據(jù)馬上轉(zhuǎn)換到從接收狀態(tài)時就會有大概3秒鐘得延遲狀態(tài),請問是哪里沒弄對,代碼如下,麻煩老師給指點(diǎn)一下,謝謝
以下是主發(fā)送程序
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外設(shè)
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外設(shè)
I2C_ITConfig(I2C_IT_BUF, ENABLE);
I2C_ITConfig(I2C_IT_EVT, ENABLE);
I2C_ITConfig(I2C_IT_ERR, ENABLE);
PFIC_EnableIRQ(I2C_IRQn);
}
請問老師在報告仲裁丟失以后,系統(tǒng)好像跑飛了,雖然還能進(jìn)i2c中斷,也能打印輸出,但是不在主循環(huán)里面了,請問老師這個要怎么回事?
按照你這個需求需要主從機(jī)之間協(xié)議約束好,兩邊切換狀態(tài)的時間要同步?;蛘咧鳈C(jī)端使用軟件模擬iic。模擬I2C主機(jī)(CH579 CH573 CH582) - debugdabiaoge - 博客園 (cnblogs.com)
感謝老師解答,我這個是作為指令翻譯器使用的,其他有3個設(shè)備都是主從機(jī)自動切換的,而且其他3個設(shè)備是不能改變的,都是其他廠家的東西,因?yàn)樾枰俨?,所以還不能用模擬i2c,只能使用硬件i2c,現(xiàn)在遇到的問題是報告仲裁丟失以后程序就跑飛了,脫離主循環(huán)了,請問老師這個大概是什么原因?
加打印看一下是否是卡在某個中斷里面沒有退出,確認(rèn)已經(jīng)清除中斷標(biāo)志位。