I2C掃瞄從裝置方法

2021-08-13 05:37:59 字數 3174 閱讀 6740

這幾天在研究0.96寸oled屏;但是一直都點不亮,同事建議用i2c掃瞄從裝置位址,如是寫了這個函式;雖然最終確定不是軟體問題,但是解題思路很好,因此記錄下來;mcu是stm32f103ve.

i2c傳送從裝置位址,檢測哪些位址有應答,則把這些位址答應出來,即可知道此i2c掛載了多少從裝置;

i2c_scan.h

#ifndef __i2c_scan_h

#define __i2c_scan_h

#include "stm32f10x.h"

#include "stm32f10x_i2c.h"

/**************************i2c引數定義,i2c1或i2c2********************************/

#define eeprom_i2cx i2c1

#define eeprom_i2c_apbxclock_fun rcc_apb1periphclockcmd

#define eeprom_i2c_clk rcc_apb1periph_i2c1

#define eeprom_i2c_gpio_apbxclock_fun rcc_apb2periphclockcmd

#define eeprom_i2c_gpio_clk rcc_apb2periph_gpiob

#define eeprom_i2c_scl_port gpiob

#define eeprom_i2c_scl_pin gpio_pin_6

#define eeprom_i2c_sda_port gpiob

#define eeprom_i2c_sda_pin gpio_pin_7

/*等待超時時間*/

#define i2ct_flag_timeout ((uint32_t)0x1000)

#define i2ct_long_timeout ((uint32_t)(10 * i2ct_flag_timeout))

/*資訊輸出*/

#define eeprom_debug_on 0

#define eeprom_info(fmt,arg...) printf("<<-eeprom-info->> "fmt"\n",##arg)

#define eeprom_error(fmt,arg...) printf("<<-eeprom-error->> "fmt"\n",##arg)

#define eeprom_debug(fmt,arg...) dowhile(0)

void i2c_scan_init(void);

//主函式呼叫下面函式,如果檢測位址0~200中間是否有外設的位址,把200寫入進去即可

uint32_t i2c_scan(uint32_t test_address);

#endif /*__bsp_i2c_24c02_h*/

i2c_scan.c

#include "i2c_scan.h"

static __io uint32_t i2ctimeout = i2ct_long_timeout;

static uint32_t i2c_timeout_usercallback(uint8_t errorcode);

static

void i2c_gpio_config(void)

static

void i2c_mode_config(void)

void i2c_scan_init(void)

uint32_t i2c_scan(uint32_t test_address)

i2ctimeout = i2ct_flag_timeout;

/* send eeprom address for write */

i2c_send7bitaddress(eeprom_i2cx, test_address, i2c_direction_transmitter);

/* test on ev6 and clear it */

while(!i2c_checkevent(eeprom_i2cx, i2c_event_master_transmitter_mode_selected))

if(i2ctimeout>0) printf("%#x\n",test_address);

/* send stop condition */

i2c_generatestop(eeprom_i2cx, enable);

test_address--;

}

}/**

*@brief basic management of the timeout situation.

*@param errorcode:錯誤**,可以用來定位是哪個環節出錯.

*@retval 返回0,表示iic讀取失敗.

*/static uint32_t i2c_timeout_usercallback(uint8_t errorcode)

本次掛載了兩個從裝置,乙個是24c02位址為0xa0;乙個是oled,位址為0x78;但最終列印出來的資料如下:

0xaf

0xae

0xad

0xac

0xab

0xaa

0xa9

0xa8

0xa7

0xa6

0xa5

0xa4

0xa3

0xa2

0xa1

0xa0

0x79

0x78

不知道為什麼會列印這麼多;知道的講一下哦!

i2c裝置驅動

1,i2c 裝置註冊 static struct i2c board info i2c2 devices i2c裝置一般在板級 中註冊 static void msm8916 add i2c deivces void 2,i2c驅動註冊 include static const struct i2c...

I2C器件的從裝置位址設定

i2c中24c02從位址設定 今天看了一下at24c02的程式,發現 從裝置位址 有點不明白,現在以at24c02為例子說說我的見解。首先,先看一下at24c02的晶元資料,我們會發現at24c02有三個位址a0,a1,a2。同時,我們會在資料的device address介紹發現i2c器件一共有七...

I2C裝置驅動流程

一 i2c裝置 驅動流程 1 i2c register board info 定義i2c 器件資訊 name,address,etc.static struct i2c board info initdata pi2c board info i2c register board info 1,arr...