久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: MCU如何檢測I2C設備是否存在? [打印本頁]

作者: _BEAR_    時間: 2023-6-10 18:32
標題: MCU如何檢測I2C設備是否存在?
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表示檢測到


(2)換設備引腳改從機地址,SCL低電平,SDA高電平,i2c_CheckDevice(BH1750_Addr)函數返回1表示未檢測


(3)不連接設備,SCL和SDA都為低電,i2c_CheckDevice(BH1750_Addr)函數返回0表示檢測到?



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都輸出高電平
}



作者: xuyaqi    時間: 2023-6-11 05:50
采集來的數據在正常范圍,說明設備存在。
作者: silentdeepsea    時間: 2023-6-11 07:16
你IIC總線上有上拉電阻嗎?
作者: Y_G_G    時間: 2023-6-11 10:53
iic是有應答機制的,有應答就是有設備,沒有應答就是沒有設備
作者: a399288395    時間: 2023-6-11 13:35
根據應答信號 檢測從設備是否在線和損壞或者掉線;仔細看一下IIC的通訊協議,就清楚了; 硬件上面 我一般習慣IIC的總線額外添加3.3K-10K的上拉電阻; 5V設備一般用4K7就可以了;
作者: _BEAR_    時間: 2023-6-11 22:06
已解決:BH1750模塊內置上拉電阻,所以STM32直接連接就可以通信,但是當沒有設備連接還想讓SCL和SDA處于高電平就得額外接上拉電阻。
作者: _BEAR_    時間: 2023-6-11 22:15
已解決:BH1750模塊已經內置上拉電阻,所以直接連接就可以進行I2C通信,但是當沒有外設連接的時候還想讓SCL和SDA處于高電平需要額外接上拉電阻。
還有個疑問:在沒有釋放總線之前SCL和SDA都是主機控制,那沒有設備連接時不應該也能檢測到不完整的輸出波形嗎?為什么我用示波器沒有檢測到
作者: coody_sz    時間: 2023-6-12 11:00
讀取器件信息即可知道
作者: Hephaestus    時間: 2023-6-12 12:16
_BEAR_ 發表于 2023-6-11 22:06
已解決:BH1750模塊內置上拉電阻,所以STM32直接連接就可以通信,但是當沒有設備連接還想讓SCL和SDA處于高 ...

STM32可以設置內部上拉,你沒有打開。
作者: _BEAR_    時間: 2023-6-16 13:42
Hephaestus 發表于 2023-6-12 12:16
STM32可以設置內部上拉,你沒有打開。

但是I2C通信要設置為開漏輸出模式不是嗎
作者: cjjdemon    時間: 2023-6-16 13:55
這IIC的波形質量好差
作者: Longan.Wang    時間: 2023-6-16 15:25
Y_G_G 發表于 2023-6-11 10:53
iic是有應答機制的,有應答就是有設備,沒有應答就是沒有設備

正解,支持一下
作者: KysonZhou    時間: 2024-1-16 15:53
請問是只有添加了上拉電阻才能解決嗎

作者: hclin    時間: 2024-1-17 01:22
device沒回應ack,就代表不存在。
作者: rayin    時間: 2024-1-17 07:34
通過I2C讀取從器件的ID值, 有ack就是有設備存在, 沒有就是沒有設備存在.
作者: KysonZhou    時間: 2024-1-17 10:32
可以在傳感器的采集時序函數里面設置返回值,調用時序函數時再檢查一下有沒ack返回。我也碰到跟你一樣的問題,就這樣解決了。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 91av免费观看| 久久久久久成人 | 久久久精品综合 | 日韩精品成人一区二区三区视频 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 日韩精品一区在线 | 久久九九影视 | 婷婷在线视频 | 久久日韩精品一区二区三区 | 午夜伦理影院 | 国产精品国产三级国产播12软件 | 秋霞在线一区 | 国产91一区| 日韩国产在线观看 | 国产精品一二区 | 亚洲精选一区 | 久久91av| 精品国产黄色片 | 国产精品成人一区二区三区夜夜夜 | 久久久九九九九 | 国产欧美精品在线观看 | 91精品国产色综合久久 | 日韩三级 | 国产精品久久九九 | 国产美女久久 | av先锋资源 | 久草青青草 | 久久精品毛片 | 午夜精品一区二区三区在线观看 | 成人精品一区二区三区四区 | 国产精品久久二区 | 黄网站涩免费蜜桃网站 | 午夜三区 | 亚洲一区在线日韩在线深爱 | 国产美女精品 | 视频一区二区三区四区五区 | 久久综合一区 | 99色综合| 91精品国产91久久综合桃花 | 欧美不卡一区二区 | 一级欧美一级日韩片免费观看 |