IIC驅動的實現簡介
IIC驅動可以有兩種方法實現
- 阻塞式(等待型)
- 非阻塞式(中斷型)
阻塞型驅動
需要打開:
- I2C外設中斷開關
一般包含以下函數接口:
- 初始I2C外設:void i2c_init(void);
- 去初始I2C外設:void i2c_uninit(void);
- I2C開始信號:void i2c_start(void);
- I2C停止信號:void i2c_stop(void);
- I2C等待:bool i2c_wait(void);
- I2C判忙:bool i2c_busy(void);
- I2C讀:void i2c_read(uint8_t addr, uint8_t* data);
- I2C寫:void i2c_write(uint8_t addr, uint8_t* data, uint8_t size);
在該.c文件下,由於I2C是由中斷事件觸發的,通過輪詢I2C的寄存器標誌位並加上超時機制來達到目的(函數:i2c_wait()),每進行一個操作都需要I2C外設做出迴應並使用i2c_wait()函數進行等待(阻塞),並應用到讀寫的各個邏輯條件中。
非阻塞型驅動
需要打開:
- I2C外設中斷開關
- 中斷向量表上對應的I2C中斷開關
一般包含以下函數接口:
- 初始I2C外設:void i2c_init(void);
- 去初始I2C外設:void i2c_uninit(void);
- I2C中斷處理函數:void i2c_interrupt_isr_handler(void)…;
- I2C中斷讀:void i2c_inter_read(uint8_t addr, uint8_t* data);
- I2C中斷寫:void i2c_inter_write(uint8_t addr, uint8_t* data, uint8_t size);
在該.c文件下,使用全局變量來標記各個狀態,由於I2C是由中斷事件觸發的,所以這些全局變量的狀態是在中斷裏面改變的,中斷中改變的標誌可以應用於I2C讀寫的邏輯條件。
應用
寄存器
I2C中有三個常用的寄存器(幾乎所有的單片機(引腳模擬的不算)中都有,只是名字不一樣):
- 用於讀寫的數據寄存器:I2CDR
- 用於控制的寄存器:I2CCR
- 用於查詢狀態的寄存器:I2CSTR