1.部分代碼:(軟件模擬I2C連接BH1750模塊,來自正點原子代碼示例)
/*
*********************************************************************************************************
* 函 數 名: i2c_Stop
* 功能說明: CPU發起I2C總線停止信號
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
void i2c_Stop(void)
{
/* 當SCL高電平時,SDA出現一個上跳沿表示I2C總線停止信號 */
BH1750_I2C_SDA_0();
BH1750_I2C_SCL_1();
i2c_Delay();
BH1750_I2C_SDA_1();
}
/*
*********************************************************************************************************
* 函 數 名: i2c_WaitAck
* 功能說明: CPU產生一個時鐘,并讀取器件的ACK應答信號
* 形 參:無
* 返 回 值: 返回0表示正確應答,1表示無器件響應
*********************************************************************************************************
*/
uint8_t i2c_WaitAck(void)
{
uint8_t re;
BH1750_I2C_SDA_1(); /* CPU釋放SDA總線 */
i2c_Delay();
BH1750_I2C_SCL_1(); /* CPU驅動SCL = 1, 此時器件會返回ACK應答 */
i2c_Delay();
if (BH1750_I2C_SDA_READ()) /* CPU讀取SDA口線狀態 */
re = 1;
else
re = 0;
BH1750_I2C_SCL_0();
i2c_Delay();
return re;
}
/*
*********************************************************************************************************
* 函 數 名: i2c_CheckDevice
* 功能說明: 檢測I2C總線設備,CPU向發送設備地址,然后讀取設備應答來判斷該設備是否存在
* 形 參:_Address:設備的I2C總線地址
* 返 回 值: 返回值 0 表示正確, 返回1表示未探測到
*********************************************************************************************************
*/
uint8_t i2c_CheckDevice(uint8_t _Address)
{
uint8_t ucAck;
i2c_Start(); /* 發送啟動信號 */
/* 發送設備地址+讀寫控制bit(0 = w, 1 = r) bit7 先傳 */
i2c_SendByte(_Address | BH1750_I2C_WR);
ucAck = i2c_WaitAck(); /* 檢測設備的ACK應答 *
i2c_Stop(); /* 發送停止信號 */
return ucAck;
}
2.現象:
(1)正常連接,時序正常(黃色為SCL,綠色為SDA),i2c_CheckDevice()函數返回0表示檢測到
51hei圖片20230610173002.jpg (353.91 KB, 下載次數: 57)
下載附件
2023-6-10 18:21 上傳
IMG_20230610_174048.jpg (5.2 MB, 下載次數: 60)
下載附件
2023-6-10 18:20 上傳
(2)換設備引腳改從機地址,SCL低電平,SDA高電平,i2c_CheckDevice(BH1750_Addr)函數返回1表示未檢測
51hei圖片20230610173034.png (2.49 MB, 下載次數: 49)
下載附件
2023-6-10 18:21 上傳
51hei圖片20230610172952.jpg (340.07 KB, 下載次數: 57)
下載附件
2023-6-10 18:21 上傳
(3)不連接設備,SCL和SDA都為低電,i2c_CheckDevice(BH1750_Addr)函數返回0表示檢測到?
IMG_20230610_174029.jpg (4.22 MB, 下載次數: 62)
下載附件
2023-6-10 18:20 上傳
IMG_20230610_174059.jpg (4.7 MB, 下載次數: 56)
下載附件
2023-6-10 18:21 上傳
3.問題:怎么讓不連接設備的時候i2c_CheckDevice(BH1750_Addr)函數返回1
static void I2C_BH1750_GPIOConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(BH1750_RCC_I2C_PORT, ENABLE); /* 打開GPIO時鐘 */
GPIO_InitStructure.GPIO_Pin = BH1750_I2C_SCL_PIN | BH1750_I2C_SDA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /* 開漏輸出 */
GPIO_Init(BH1750_GPIO_PORT_I2C, &GPIO_InitStructure);
/* 給一個停止信號, 復位I2C總線上的所有設備到待機模式 */
i2c_Stop(); //初始化的時候已經讓SCL和SDA都輸出高電平
}
|