這幾天在研究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...