stm32-IIC
i^2c,iiCBus,集成电路总线,同步串行半双工通信总线方式
sck:时钟同步信号
SDA:发送数据
GND:接地
通信对象:芯片与芯片
主从应答方式:
SDA:数据总线
SCL:时钟总线
在硬件设计中:
上拉电阻:保证双方都在释放总线时,都保持高电平。
阻值大小:4.7k-10k
通信协议:两个设备,无论在SDA还是、scl,未通信都是高电平
通信时,sda变低信号,意味着开始通信,
主机让sck发出标准方波(高位先行)时钟线速率(100Kbps-400Kbps)
sda置高不允许在SCK置高时置高,所以,当sda发送数据时,SCK必须保持稳定。
接收方会在高电平时采样。
发送一段1010 1100的数据,
当发送第九个bit时,主机会无条件发送一个高电平,从机给一个应答将其拉低,称之为ACK
从机不应答将其拉低,称之为NACK
停止位,双方同时置高,发送结束
理论上i2c可以连接2^7个传感器
1010 0001末尾这位0、1表示数据流向
低电平:主机流向从机 ACK 写
高电平:从机流向主机 NACK 读
DEVICE ADDRESS 寄存器地址
WORD ADDRESS 数据地址
RISC精简指令微处理器、
void i2c_interrupt_handler(void) {i2c_flag=1; } void init_i2c(void) {IICCON |= (1 << 7);IICCON |= (1 << 6);IICCON |= (1 << 5);IICCON &= ~(0xF << 0);GPECON |= ((unsigned int)10 << 28);register_irq(i2c_interrupt_handler, 27);enable_irq(27); }void do_and_wait_ack(void) {i2c_flag=0;IICCON &= ~(1<<4);while(i2c_flag == 0){delayus(400);} }
void at24c02_writes(unsigned char device_address,unsigned char reg_address,const unsigned char *pData,unsigned int len) {unsigned int i;IICSTAT =0xF0;IICDS = device_address;do_and_wait_ack();IICDS = reg_address;do_and_wait_ack();for(i=0;i<len;++i){IICDS = *pData++;do_and_wait_ack();} IICSTAT = 0XD0;IICCON &= ~(1<<4);delayus(400);; }
void at24c02_read(unsigned char device_address,unsigned char reg_address,unsigned char *pData,unsigned int len) {unsigned int i;IICSTAT =0xf0;IICDS = device_address;do_and_wait_ack();IICDS = reg_address;do_and_wait_ack();IICSTAT = 0xB0;IICDS = device_address;do_and_wait_ack();*pData = IICDS;do_and_wait_ack();for(i=0;i<len;++i){if(i == (len-1)){IICCON &= ~(1<<7);}*pData++ = IICDS;do_and_wait_ack();}IICSTAT = 0x90;IICCON &= ~(1<<4);delayus(400);IICCON |= (1<<7); }