历史上的今天

今天是:2024年10月30日(星期三)

正在发生

2019年10月30日 | STM32之I2C 学习笔记

发布者:ww313618 来源: eefocus关键字:STM32  I2C  串行总线 手机看文章 扫描二维码
随时随地手机看文章

一、基本概念

(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  I2C  串行总线 引用地址:STM32之I2C 学习笔记

上一篇:STM32之内存管理 学习笔记
下一篇:stm32学习笔记---ADC电压采集

推荐阅读

集微网消息 10月27日,ABB宣布将投资1.5亿美元(约10亿人民币)在上海康桥新建一座全球领先的机器人工厂,实现用机器人制造机器人。(图片来源:一财网)据悉,该工厂位于ABB中国机器人园区附近,将利用包括ABB Ability解决方案在内的互联数字化技术、一流的协作机器人技术以及创新的人工智能研究,打造ABB先进环保的“未来工厂”,预计2020年底投入运营...
  实时采样技术是普通电子测量仪器中常用的信号采集手段,其对信号数据获取的能力受到仪器中A/D模块的最高采样率的限制。为了弥补这个限制,我们采用随机采样技术,这样对于器件的选用有很大的余地,可大幅度降低制造成本。  随机采样的原理  根据Nyquist采样定理,当信号的频率远远大于A/D的采样频率时,信号波形是无法重新构建的。所以对高速的信...
由于 iPhone 12 采用了新的外观设计,因此也出现了不少新的问题,其中就包括了掉漆。iPhone 12 采用铝金属材质边框,而 iPhone 12 Pro 系列则采用不锈钢材质边框。近日不少网友反映,iPhone 12 出现了边框掉漆的情况,这似乎并不令人意外,因为 iPhone 12 的铝金属边框(阳极氧化)工艺和 iPhone 5 时代几乎保持一致,如果你还有印象的话...
10月28日,广东省政府官网发布《 <中新广州知识城总体发展规划(2020—2035年)>实施方案》(下称《实施方案》),提出中新广州知识城将打造创新赋能的集成电路产业链。《实施方案》从打造粤港澳大湾区国际科技创新中心重要引擎、构建世界级知识密集型产业体系、打造全球知识产权高地、打造高水平对外开放新平台、营造国际一流营商环境、建设绿色智慧型创...

史海拾趣

问答坊 | AI 解惑

调89C2051通讯的吐血经验

调了15天,终于调通了。刚上网。先跪谢midsky的帮助,提供了汇编的正确程序,最重要的是使我确信是硬件出了问题!!!想想又吐血,所有的片子都是新的。线路稳定可靠,用万用表分段测过。程序又没问题。是不是COM口坏了,咳,害的我换了两台机器实 ...…

查看全部问答∨

谢谢

跪求ADF7012中文资料和它的应用电路``````我的QQ:178662785   有的请给我谢谢…

查看全部问答∨

请教 一款应急灯的变压器内部结构(附上线路图,再附上图片)

请教各位学长以下这款应急灯的变压器的内部结构以及它的一些技术参数为谢[:|][:|][:|]…

查看全部问答∨

电话原理图

电话原理图介绍…

查看全部问答∨

关于加班的问题

一位研发老总的问题:我们常常为研发人员不愿意加班而苦恼,或说公司未能形成加班的风气. XXX区这边,有时我们晚一点下班,可以看到其它公司灯火通明. HXX公司这方面做得特别好,不知你有没有什么好办法? 顾问答复:您好! 讲实话,我当初在HXX公司 ...…

查看全部问答∨

ARM开发板,核心板一般引出哪些接口啊?

ARM开发板,很多采用核心板+底板的方式,方便二次开发.核心板和底板之间一般留哪些接口?…

查看全部问答∨

SDIO设备驱动的疑问:

各位高手好呀,帮我分析一下我的SDIO接口的WIFI驱动加载失败了是什么回事呀?谢谢了哦,打印信息如下我使用的是MARVELL8686的WIFI驱动: Load Ok!Jump to 0x20500000=0xEA00Windows CE Kernel for ARM (Thumb Enabled) Built on Aug  4 ...…

查看全部问答∨

LCD 驱动 linux

    目前我在移植一个系统,在LCD上出现了问题。        LCD控制器是支持BGR555的,而系统的提供的数据是RGB565的,对应不起来,显示出来就有点乱了。我尝试修改check_var函数里面对  各种颜色位域偏置和 ...…

查看全部问答∨

EVC下将string型转成char*类型

EVC下将string型转成char*类型. CString   str(_T("01234567"));    char   *ch   =   str.GetBuffer(0); 这在VC6.0中编译没任何问题.但EVC下编译出错. error c2440:"initializing ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved