一、基本概念
(1)I2C是两线式串行总线,由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。
(2)IIC是半双工通信方式,也就是说它既可以接收也可以发送,但是由于它只有一根数据线,所以接收和发送不能同时进行。
二、I2C协议
(1)空闲状态:数据线SDA和时钟SCL线都处于高电平。
(2)开始信号:SCL线持续处于高电平,数据线SDA由高变为低。
(3)停止信号:SCL线持续处于高电平,数据线SDA由低变为低。
(4)应答信号:位发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答(ACK简称应答位)
(5)数据的有效性:数据SDA在SCL的上升沿到来之前就需准备好。并在在下降沿到来之前必须稳定。否则,你可以想象,就会被认为是开始信号或者停止信号。
(6)数据的传输:在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。
三、代码讲解
//产生IIC起始信号
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;//发送I2C总线结束信号
delay_us(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//时钟输出0
return 0;
}
//产生ACK应答
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//不产生ACK应答
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
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); //对TEA5767这三个延时都是必须的
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
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();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}
四、EEPROM(24C02)
上一篇:STM32之内存管理 学习笔记
下一篇:stm32学习笔记---ADC电压采集
推荐阅读
史海拾趣
随着市场的不断变化和客户需求的日益多样化,兵字公司意识到,要想在市场中保持领先地位,就必须不断进行技术创新。于是,公司投入大量研发资源,成功研发出了小型精密互感器。这一创新产品不仅填补了市场空白,还为公司带来了可观的收益。同时,兵字公司也凭借这一技术突破,进一步巩固了在电子元器件领域的领先地位。
HBH-Microwave的故事始于对高性能微波组件的执着追求。在成立初期,公司便聚焦于设计并制造能够满足严苛应用需求的微波放大器。通过不断的技术研发,HBH成功推出了HA6013型号的高功率放大器,该产品在17.0至18.0 GHz频段内表现出色,迅速在通信和雷达领域获得认可。这一创新不仅巩固了HBH在微波技术领域的地位,也为后续产品的开发奠定了坚实的技术基础。
ELMOS作为一家欧洲公司,在世界各地都设有研发和销售办事处。这种全球化的布局使得ELMOS能够更好地了解不同市场的需求,为客户提供更加贴近市场的产品和服务。同时,通过与全球各地的客户和合作伙伴的紧密合作,ELMOS不断拓展其国际市场份额,进一步提升了公司的国际影响力。
DACHANG公司的起点可追溯到一次重要的技术突破。当时,公司创始人带领团队经过数月的艰苦研发,成功开发出了一款具有革命性意义的新型电子元件。这款元件不仅性能卓越,而且成本较低,极大地满足了市场对于高性价比电子产品的需求。凭借这一技术突破,DACHANG公司迅速在市场上获得了认可,为公司后续的发展奠定了坚实的基础。
在电子行业的早期,ETC公司以其独特的技术创新能力在晶体管市场上崭露头角。公司创始人带领研发团队,通过不断的实验和改进,成功研发出一种新型的MOSFET晶体管,具有更高的性能和更低的功耗。这一创新成果迅速在市场上引起轰动,ETC公司的知名度也随之提升。随着产品销量的不断增长,ETC逐渐在电子行业中确立了其领导地位。
FETek Technology(东沅)于XXXX年在台湾台北市成立,由一群志同道合的半导体行业专家组成。他们看到了当时电子行业对高质量、高效率半导体测试解决方案的迫切需求,于是决定创立东沅,专注于提供这一领域的创新产品。初期,公司面临资金紧张、人才匮乏等挑战,但他们凭借坚定的信念和不懈的努力,逐渐吸引了更多的投资者和优秀人才加入。
调了15天,终于调通了。刚上网。先跪谢midsky的帮助,提供了汇编的正确程序,最重要的是使我确信是硬件出了问题!!!想想又吐血,所有的片子都是新的。线路稳定可靠,用万用表分段测过。程序又没问题。是不是COM口坏了,咳,害的我换了两台机器实 ...… 查看全部问答∨ |
|
各位高手好呀,帮我分析一下我的SDIO接口的WIFI驱动加载失败了是什么回事呀?谢谢了哦,打印信息如下我使用的是MARVELL8686的WIFI驱动: Load Ok!Jump to 0x20500000=0xEA00Windows CE Kernel for ARM (Thumb Enabled) Built on Aug 4 ...… 查看全部问答∨ |
目前我在移植一个系统,在LCD上出现了问题。 LCD控制器是支持BGR555的,而系统的提供的数据是RGB565的,对应不起来,显示出来就有点乱了。我尝试修改check_var函数里面对 各种颜色位域偏置和 ...… 查看全部问答∨ |
EVC下将string型转成char*类型. CString str(_T("01234567")); char *ch = str.GetBuffer(0); 这在VC6.0中编译没任何问题.但EVC下编译出错. error c2440:"initializing ...… 查看全部问答∨ |