CH582F 使用i2c讀取sht30數(shù)據(jù),重新上電后i2c就被卡住

int SHT30_I2C_Read_Singlesh(void)

{

? ? uint16_t timer_over = 0;

? ? uint8_t i = 0;

? ? uint8_t sht30_I2CRxData[6]={0};//裝要接受的數(shù)據(jù)的數(shù)據(jù)

? ? uint8_t sht30_I2C_RxDataLen=6;//接受數(shù)據(jù)的長度

? ? float temperature =0.0 ;

? ? float humidity=0.0;

? ? SHT30_I2CTxData[0]= ( 0xff00 & CMD_MEAS_POLLING_M) >> 8;

? ? SHT30_I2CTxData[1]=0X00FF & CMD_MEAS_POLLING_M ;

? ? SHT30_I2C_TxDataLen = 2;//數(shù)據(jù)長度

? ?// printf("1\r\n");

? ?// I2C_SoftwareResetCmd(ENABLE);

? ? I2C_Init(I2C_Mode_I2C, 100000, I2C_DutyCycle_16_9, I2C_Ack_Enable, I2C_AckAddr_7bit, 0x11);

? ? DelayMs(10);

? ? while(I2C_GetFlagStatus(I2C_FLAG_BUSY));

? //? printf("2\r\n");

? ? I2C_GenerateSTART(ENABLE);

? //? printf("3\r\n");

? ? while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

? ? DelayMs(10);

? ?// printf("4\r\n");

? ? I2C_Send7bitAddress(SHT30_Adderss, I2C_Direction_Transmitter);

? ? DelayMs(10);

? ?// printf("5\r\n");

? ? while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));


? ?// printf("6\r\n");

? ? while(i < 2)

? ? {

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

? ? ? ? {

? ? ? ? ? ? I2C_SendData(SHT30_I2CTxData[i]);

? ? ? ? ? ? i++;

? ? ? ? }

? ? }

? ?// printf("7\r\n");

? ? while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

? ? I2C_GenerateSTOP(ENABLE);

? //? printf("8\r\n");


? ? while(!I2C_GetFlagStatus(I2C_FLAG_BUSY));

? ?// printf("9\r\n");

? ? I2C_GenerateSTART(ENABLE);

? ? while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

#if 1

? ? DelayUs(100);

? //? printf("10\r\n");

? ? I2C_Send7bitAddress(SHT30_Adderss, I2C_Direction_Receiver);

? ?// printf("10\r\n");


? ? while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))

? ? {

? ? ? ? timer_over++;

? ? ? ? DelayMs(1);

? ? ? ? if(timer_over>=1000)

? ? ? ? {

? ? ? ? ? ?// I2C_SoftwareResetCmd(ENABLE);

? ? ? ? ? ? SHT30_I2C_Softreset();

//? ? ? ? ? ? I2C_Init(I2C_Mode_I2C, 100000, I2C_DutyCycle_16_9, I2C_Ack_Enable, I2C_AckAddr_7bit, 0x11);

? ? ? ? ? ? return -1;

? ? ? ? }

? ? };

? ? printf("11\r\n");

? ? i=0;

? ? while(i < 6)

? ? {

? ? ? ?// printf("->i =%d\r\n",i);

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

? ? ? ? {

? ? ? ? ? ? sht30_I2CRxData[i]=I2C_ReceiveData();//

? ? ? ? ? ? i++;

? ? ? ? ? ? if(i==5)

? ? ? ? ? ? {

? ? ? ? ? ? ? ?// printf("->i =%d\r\n",i);

? ? ? ? ? ? ? ? I2C_AcknowledgeConfig(DISABLE);//:清除 ACK 位

? ? ? ? ? ? ? ? I2C_GenerateSTOP(ENABLE);//STOP 位置位

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? if(crc8(sht30_I2CRxData, 2) == sht30_I2CRxData[2])

? {

? ? ? ? ?temperature = -45.0 + (sht30_I2CRxData[1] | sht30_I2CRxData[0] << 8) * 175.0 / (0xFFFF - 1);

? ? ? ? ?printf("-->%.2f \r\n",temperature);

? ? ? // LOG_D("electric_Temp_hum_1: %d.%d \n", (int)electric_Temp_hum_1.Temperature, (int)(electric_Temp_hum_1.Temperature * 10) % 10);

? }

? ? if(crc8(sht30_I2CRxData + 3, 2) == sht30_I2CRxData[5])

? ? {

? ? ? ? humidity = (sht30_I2CRxData[4] | sht30_I2CRxData[3] << 8) * 0.0015259022;

? ? ? ? printf("-->%.2f \r\n",humidity);

? ? }

#endif

//? ? while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

//? ? I2C_AcknowledgeConfig(DISABLE);//:清除 ACK 位

//? ? I2C_GenerateSTOP(ENABLE);//STOP 位置位

//? ? printf("-->%x %x %x %x %x %x \r\n",sht30_I2CRxData[0],sht30_I2CRxData[1],sht30_I2CRxData[2],sht30_I2CRxData[3],sht30_I2CRxData[4],sht30_I2CRxData[5]);

//? ? while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

//? ? I2C_GenerateSTOP(ENABLE);

//? ? I2C_SoftwareResetCmd(ENABLE);

}

第一次下載固件的時(shí)候,i2c正常讀取數(shù)據(jù),只要一斷電重啟,第一遍運(yùn)行就卡在這里,第二遍運(yùn)行就卡其他地方了

image.png

您好,檢查一下硬件線路有沒有問題??梢詫2C狀態(tài)寄存器R16_I2C_STAR1和R16_I2C_STAR2打印出來,查看哪些標(biāo)志位沒有通過判斷。有邏輯分析儀抓包的話,可以查看主機(jī)下發(fā)的從機(jī)地址有沒有發(fā)出,發(fā)出后有沒有從機(jī)應(yīng)答。


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

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