I2C:两线式串行总线,是由数据线SDA和时钟线SCL构成的串行总线,是一种半双工通信方式。
数据线SDA有时需要用做输入,有时需用做输出。需要通过MODER寄存器进行配置;
#define SDA_IN() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;}
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;}
#define IIC_SCL PBout(8) //SCL
#define IIC_SDA PBout(9) //SDA输出
#define READ_SDA PBin(9) //SDA输入
数据线SDA和时钟线SCL同时处于高电平时,为I2C总线的空闲状态。
IIC_SDA = 1;
IIC_SCL = 1;
起始信号:在时钟线SCL为高电平时,数据线SDA由高跳变至低;
停止信号:在时钟线SCL为高电平时,数据线SDA由低跳变至高;
这两种信号是一种电平跳变时序信号,而不是一个电平信号。
//起始信号
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA = 1;
IIC_SCL = 1;
delay_us(4);
IIC_SDA = 0;
delay_us(4);
IIC_SCL = 0;
}
//停止信号
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;
delay_us(4);
}
发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。
应答信号为低电平时,为有效应答位(ACK);应答信号为高电平时,为非应答位(NACK),一般表示接收器接收该字节没有成功。
有效应答位(ACK):接收器在第9个时钟脉冲前的低电平期间将数据线SDA拉低,并且要保证在该时钟高电平期间数据线SDA为稳定的低电平。
//产生应答信号
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//不产生应答信号
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//等待应答信号,返回1为接收应答成功,返回0为接收应答失败
u8 IIC_Wait_Ack(void)
{
u8 ucErrTim=0;
SDA_IN();
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTim++;
if(ucErrTim>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;
return 0;
}
使用I2C总线进行数据传输时,时钟线SCL为高电平期间,数据线SDA上的数据必须保持稳定。在时钟线上的信号转为低电平时,数据线上的高电平或低电平状态才允许变化。
逐位地串行发送数据,从高位开始发送。每一位数据都有一个时钟脉冲相对应。
//数据发送
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
//数据读取
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();
else
IIC_Ack();
return receive;
}
本文转载自微信公众号「Linux开发那些事儿」,作者 LinuxThings 。转载本文请联...
互联网业务往往使用MySQL数据库作为后台存储,存储引擎使用InnoDB。我们针对互联...
一、Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候...
开发过程中,我们经常会遇到代码回滚的情况。正常人都知道,git 回滚有两大宝: ...
简介 “ 大家好我是帅哥欢迎来到帅哥的程序人生我会把经历分享出来助你了解圈内...
继 Australis 和 Photon 之后,Mozilla 现又酝酿为 Firefox 带来名为Proton的全...
不少Windows 10用户之前都抱怨一个问题,那就是系统的屏幕出现了渲染问题,而微...
console.log ,作为一个前端开发者,可能每天都会用它来分析调试,但这个简单函...
2月26日消息 众所周知,Windows 10 的安全更新和其他重要累计更新通常是在同一天...
前言 aop即是面向切面编程,众多Aop框架里Castle是最为人所知的,另外还有死去的...