CH582 I2C讀取卡死問題

嘗試使用582的硬件I2C讀取從機寄存器,但是發(fā)現(xiàn)會卡在mode_select,不知道該如何解決了

代碼參考了:

http://www.findthetime.net/index.php/bbs/thread-86122-1.html

http://bbs.eeworld.com.cn/thread-1196656-1-1.html

void?i2c_read_reg(uint8_t?addr,?uint8_t?reg,?uint8_t?data_len,?uint8_t?*data)
{
????uint8_t?i?=?0;
????printf("busy1\n");
????while?(I2C_GetFlagStatus(I2C_FLAG_BUSY)?!=?RESET)
????????;
????printf("busy2\n");
????I2C_GenerateSTART(ENABLE);
????printf("modeselect1\n");
????while?(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT))
????????;
????printf("modeselect2\n");
????I2C_Send7bitAddress(addr,?I2C_Direction_Receiver);
????printf("rmodeselect1\n");
????while?(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
????????;
????printf("rmodeselect2\n");
????if?(I2C_GetFlagStatus(I2C_FLAG_TXE)?!=?RESET)
????{
????????printf("send?reg\n");
????????I2C_SendData(reg);
????}
????printf("rmodeselect1\n");
????while?(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
????????;
????printf("rmodeselect2\n");
????if?(data_len?==?1)
????{
????????I2C_GenerateSTOP(ENABLE);
????????printf("I2C_FLAG_RXNE?1\n");
????????if?(I2C_GetFlagStatus(I2C_FLAG_RXNE)?!=?RESET)
????????{
????????????printf("I2C_FLAG_RXNE?2\n");
????????????*data?=?I2C_ReceiveData();
????????}
????}
????else
????{
????????while?(i?<?(data_len))
????????{
????????????if?(I2C_GetFlagStatus(I2C_FLAG_RXNE)?!=?RESET)
????????????{
????????????????data[i]?=?I2C_ReceiveData();
????????????????i++;
????????????????if?(i?==?(data_len?-?1))
????????????????{
????????????????????I2C_GenerateSTOP(ENABLE);
????????????????}
????????????}
????????}
????}
}

int?main()
{
????uint8_t?len?=?0;
????int?err?=?0;
????SetSysClock(CLK_SOURCE_PLL_32MHz);

????/*?配置串口1:先配置IO口模式,再配置串口?*/
????GPIOA_SetBits(GPIO_Pin_9);
????GPIOA_ModeCfg(GPIO_Pin_8,?GPIO_ModeIN_PU);??????//?RXD-配置上拉輸入
????GPIOA_ModeCfg(GPIO_Pin_9,?GPIO_ModeOut_PP_5mA);?//?TXD-配置推挽輸出,注意先讓IO口輸出高電平
????UART1_DefInit();

????printf("hello\n");

????GPIOB_ModeCfg(GPIO_Pin_13?|?GPIO_Pin_12,?GPIO_ModeIN_PU);

????I2C_SoftwareResetCmd(ENABLE);
????I2C_SoftwareResetCmd(DISABLE);

????I2C_Init(I2C_Mode_I2C,?100000,?I2C_DutyCycle_16_9,?I2C_Ack_Enable,?I2C_AckAddr_7bit,?0x01);
????I2C_StretchClockCmd(ENABLE);
????I2C_Cmd(ENABLE);

????uint8_t?*da;
????i2c_read_reg(0x12,?0x00,?1,?da);
????printf("data:%02x\n",?da);
}

icon_rar.gifmain.zip

根據(jù)串口打印信息,是卡在了I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED

QQ截圖20220522100552.png


從機芯片使用的是qma7981

寄存器如下,代碼是讀chip-id,在esp32平臺測過可以讀取,硬件無問題。

1653184758554619.png

1653184758169902.png


根據(jù)v307的代碼改了一下,但還是不能用

u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)

{

? ? u8 i=0;


? ? I2C_AcknowledgeConfig(ENABLE );


? ? I2C_GenerateSTART( ENABLE );


? ? while( !I2C_CheckEvent(? I2C_EVENT_MASTER_MODE_SELECT ) ) ;

? ? I2C_Send7bitAddress((addr << 1) | 0X00,I2C_Direction_Transmitter); //發(fā)送器件地址+寫命令


? ? while( !I2C_CheckEvent(? I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) ); //等待應(yīng)答


? ? I2C_SendData(reg);? ? ? ? ?//寫寄存器地址



? ? I2C_GenerateSTART(? ENABLE );

? ? while( !I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT ) );


? ? I2C_Send7bitAddress(((addr << 1) | 0x01),I2C_Direction_Receiver);//發(fā)送器件地址+讀命令

? ? while( !I2C_CheckEvent(? I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ) ); //等待應(yīng)答


? ? while(i < len)

? ? {

? ? ? ? if( I2C_GetFlagStatus( I2C_FLAG_RXNE ) !=? RESET )

? ? ? ? {

? ? ? ? ? ? if(i == (len - 2))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? I2C_AcknowledgeConfig(DISABLE );

? ? ? ? ? ? ? ? buf[i] = I2C_ReceiveData();? ? ?//讀數(shù)據(jù),發(fā)送nACK


? ? ? ? ? ? }

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? buf[i] = I2C_ReceiveData();? ? ?//讀數(shù)據(jù),發(fā)送ACK

? ? ? ? ? ? }

? ? ? ? ? ? i++;

? ? ? ? }

? ? }


? ? I2C_GenerateSTOP( ENABLE ); //產(chǎn)生一個停止條件


? ? return 0;

}

現(xiàn)象:

1653208941770162.png

1653208941113318.png



已解決,謝謝


老哥,怎么解決的,我也遇到一樣的問題了



可以參考以下博客

以EEPROM為例的硬件IIC的使用 - JayWell - 博客園 (cnblogs.com)

注意下圖位置的相關(guān)代碼

6fbf098978f80420bbc8e3d04b699f0.png


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频