i2c总线相关知识
总线架构
何为总线?:
意味着再I2C线路上可以通过并联方式连接很多的器件,并进行数据传输
SCL:时钟线;
SDA:数据线
从机地址:
由生产厂家设置和规定,有七位,前四位不变,
A2,A1,A0分别表示的是三个管教各自的电平;
0位为方向位;高电平为读操作,低电平为写操作;
建立连接的过程
1、单片机像某个设备发送带有寻址字节的从机地址后;
2、该i2c设备,会向单片机发送一个应答信号;
3、建立连接;
如何发送寻址字节-串行发送
1、单片机向设备进行数据发送,发送寻址字节,前七位为设备的位,最后一位为0,表示写操作;
2、单片机逐位进行设备的写操作;
3、设备接收后,发送应答信号;
传输开始’
i2c的数据传输
字节传输方式
写操作的时序图:
I2C采样过程
开始信号
启动信号:
scl高电平---》scl高电平
sda高电平---》sda低电平
void start(){
scl = 1;
sda = 1;
delay5us();
sda = 0;
delay5us();
}
采样信号
scl低电平期间,可以改变sda数据线电平;scl高电平期间,不可以改变sda数据线电平;
发送信号
发送数据对应的代码“
void send_data(unsigend char data){
scl = 0; //设置为低电平
for(int i = 1;i<8;i++){
if(data&0x80)
sda = 1;
else
sda = 0;
data = data<<1;
delay_5us(); //延时TCLCH时间。低时钟周期
scl = 1;
delay_5us();//演示TCLCHL时间,高时钟周期
scl = 0;
}
}
应答数据
/*先将slc拉低;
sda拉高;
拉高scl读取sda的信号是否为低*/
void rec_data(){
scl = 0;
sda = 1;//释放总线
delay5us();
scl = 1;
dalay5us();
while(sda==1){//器件会主动拉低sda的电平
;;
}
scl = 0;
led1 = 0;
}
不断重复————send————rec————send————rec
结束信号
当scl为高电平的时候;
sda出现上升沿;
void stop(void){
scl =1;
sda =0;
delay5us();
sda = 1;
delay5us();
}
完整传输流程代码
void i2c_write(unsigned char dev_addr,unsigned char addr,unsigned char i){
start();
send_data(dev_addr);//寻址字节
rec_data();
send_data(addr);//储存单元地址
rec_data();
send_data(i);//要发送的数据
stop();
}