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精简指令微处理器、
cppvoid 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); } }
cppvoid 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);; }
cppvoid 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); }