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); }