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