1. 嵌入式各接口-i2c、uart、spi

 1. I2C接口

——概述:I2C是一个两线接口,一条数据线、一条时钟线,采用边沿触发方式。使用方式为cpu<——>device

——从设备:系统中所有外围器件都有一个7位的地址码,高四位为器件类型,由生产厂家制定,低三位为器件引脚定义地址,由使用者定义。主控制器通过地址码建立多机通信的机制,终端挂载在总线上,有主端和从端之分,主端必须是带有cpu的逻辑模块,在同一总线上的同一时刻只能有一个主端,可以有多个从端。

——速率

    普通模式:100khz  |      快速模式:400khz    |     高速模式:3.4Mhz

——协议

1. 空闲状态:

I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出场效应管处于截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

2. 起始位和停止位的定义:

起始信号:当SCL为高期间,SDA由高到低的跳变,启动信号是一种电平跳变时序信号,而不是一个电平信号。

停止信号:当SCL为高期间,SDA由低到高的跳变,停止信号是一种电平跳变时序信号,而不是一个电平信号。

发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了改字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。

——数据的有效性:

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

写一个字节

void write_byte(uchar date)//写一个字节

{

uchar i,temp;

temp=date;

for(i=0;i<8;i++){

        temp=temp<<1;

        scl=0;

        //拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态下才允许变化,并在此时和上一个循环的scl=1一起形成一个上升沿

        delay();

        sda=CY;

        delay();

        scl=1;//拉高SCL,此时SDA上的数据稳定

        delay();

}

scl=0;//拉低SCL,为下次数据传输做好准备

delay();

sda=1;//释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号

delay();

}

uchar read_byte()//读一个字节

{

uchar i,k;

scl=0;

delay();

sda=1;

delay();

for(i=0;i<8;i++){

        scl=1;//上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据已经稳定,可以接收

        delay();

        k=(k<<1)|sda;

        scl=0;//拉低SCL

        delay();

}

return k;

}

写一个字节的流程

void write_add(uchar address,uchar data)//任意写一个字节

{

        start();//启动——在SCL为高电平期间,SDA一个下降沿触发,开始发送

        write_byte(0xa0);// 发送从设备地址 0x0a,写操作0x00

        respons();//等待从设备响应

        write_byte(address);//发出芯片内的寄存器地址,示意要给此寄存器赋值

        respons();

        write_byte(data);      //写寄存器

        respons();

        stop();   // _停止信号,SCL在高电平期间,SDA一个上升沿触发,结束发送。

}

读取一个字节

uchar read_add(uchar address)//读取一个字节

{

        uchar data;

        start();//启动——在SCL为高电平期间,SDA一个下降沿触发,开始发送

        write_byte(0xa0);//发送从设备地址,写操作,片选

        respons();//等待从设备响应

        write_byte(address);//发送芯片内地址,告知要读写的寄存器

        respons();

        start();

        write_byte(0xa1);//发送从设备地址 读操作

        respons();

        data=read_byte();//获取数据

        stop();

        return data;

}


I2C的读写流程:

写寄存器的标准流程为:

1.    Master发起START

2.    Master发送I2C addr(7bit)和w操作0(1bit),等待ACK

3.    Slave发送ACK

4.    Master发送reg addr(8bit),等待ACK

5.    Slave发送ACK

6.    Master发送data(8bit),即要写入寄存器中的数据,等待ACK

7.    Slave发送ACK

8.    第6步和第7步可以重复多次,即顺序写多个寄存器

9.    Master发起STOP

读寄存器的标准流程为:

1.    Master发送I2C addr(7bit)和w操作1(1bit),等待ACK

2.    Slave发送ACK

3.    Master发送reg addr(8bit),等待ACK

4.    Slave发送ACK

5.    Master发起START

6.    Master发送I2C addr(7bit)和r操作1(1bit),等待ACK

7.    Slave发送ACK

8.    Slave发送data(8bit),即寄存器里的值

9.    Master发送ACK

10.    第8步和第9步可以重复多次,即顺序读多个寄存器

2. uart接口

UART  :通用异步串口,只有三根线、发送、接收、地线。由于不是靠时钟进行传输,所以不是同步传输。本质原理是采样。

电平     :使用标准的TTL/CMOS电平信号。为增强抗干扰能力,提高传输长度,常采用RS232电平(3~12 表示0)(-3~-12表示1)

传输速率:传输速率取决于串口时钟,和采样率。一般为16倍采样。

传输格式:一次发送一帧,由具有完整意义的,不可分割的若干位组成。开始位、数据位、校验位(可选)、停止位。

RS232、RS422、RS485

RS422/485采用差分传输的方式,也称作平衡传输,使用双绞线,最大的传输距离为1200米,最大的传输速率为10Mb/s。

通信距离:

RS232    :波特率9600建议在13米以内

RS422/485: 波特率9600建议在1200米以内。

RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力,总线收发器具备的灵敏度也比较高,能检测低至200mv的电压,故传输信号能在千米以外得到恢复。RS485采用半双工的工作方式,任何时候只能有一点处于发送状态,因此发送电路需由使能信号加以控制。其在多点互连时非常方便,可以省掉很多信号线。

总线RS422和RS485  的电路原理基本相同,都是以差动的方式发送和接收,不需要数字地线。差分是传输近距离远的根本原因,这是和RS232的根本区别。RS422通过两对双绞线可以全双工工作收发互不影响,RS485只能半双工工作,发收不能同时进行。

在RS232或RS485设备联成的设备网中,如果设备数量超过2台,就必须使用RS485做通讯介质,RS485网的设备间要想互通信息只有通过“主(Master)”设备中转才能实现,这个主设备通常是PC,而这种设备网中只允许存在一个主设备,其余全部是从(Slave)设备。而现场总线技术是以ISO/OSI模型为基础的,具有完整的软件支持系统,能够解决总线控制、冲突检测、链路维护等问题。现场总线设备自动成网,无主/从设备之分或允许多主存在。在同一个层次上不同厂家的产品可以互换,设备之间具有互操作性。

3. USART

USART是增加了时钟线的UART。

USART编程的一些注意事项:

uint32_t USART_BaudRate;                   // 波特率

uint32_t USART_WordLength;              / / 字长

uint32_t USART_StopBits;                    // 停止位

uint32_t USART_Parity;                        // 校验位

uint32_t USART_Mode;                        // USART模式

uint32_t OverSampling; // 过采样设置,8倍或者16倍

uint32_t CLKPolarity; //时钟极性

uint32_t CLKPhase; //时钟相位

uint32_t CLKLastBit; //最尾位时钟脉冲

USART_LastBit:选择在发送最后一个数据位的时候时钟脉冲是否在SCLK引脚输出,可以是不输出脉冲(USART_LastBit_Disable)、输出脉冲(USART_LastBit_Enable)。它设定USART_CR2寄存器的LBCL位的值。

4. spi接口

SPI接口总结 - Loadingzc的专栏 - CSDN博客

第24章 SPI—读写串行FLASH—零死角玩转STM32-F429系列 - 野火_firege - 博客园

SPI信号线:

——SPI包含四条总线,分别为SS、SCK、MOSI、MISO

——SS:片选,低电平有效,有多少从设备就有多少片选信号线,没有从设备地址。

——SCK:时钟线,由主通信设备产生,不同的设备支持的时钟频率不一样,时钟决定了通信速率。

——MOSI:主设备输出、从设备输入

——MISO:主设备输出、从设备输入

SPI模式:

根据SPI时钟极性 CPOL和时钟香味CPHA配置的不同,分为四种工作模式。

时钟极性:SPI空闲状态时,SCK的信号电平。SPOL=0, SCK在空闲状态时为低电平,CPOL=1时相反。

时钟相位:数据采样的时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的奇数边沿被采样。当CPHA=1时,在偶数边沿采样。

SPI特性及架构

(1)单次传输可选择为 8 或 16 位。

(2)波特率预分频系数(最大为 fPCLK/2) 。

(3)时钟极性(CPOL)和相位(CPHA)可编程设置 。

(4)数据顺序的传输顺序可进行编程选择,MSB 在前或 LSB 在前。

(5)可触发中断的专用发送和接收标志。

(6)可以使用 DMA 进行数据传输操作。


在SPI编程中需要注意的点:

_设置SPI的单双向模式——单工模式还是全双工程序

_设置SPI的主/从端模式——最大的区别在于SPI的SCK信号线的时序,时序是由主机产生的

_设置SPI的数据帧长度,8位还是16位——需要根据从芯片的datasheet而定

_设置时钟极性,CPOL,可选高低电平(空闲时候的时钟状态)——空闲时的时钟极性

_设置时钟相位,可选 奇/偶数边沿采样——采样时的相位

_设置NSS引脚由SPI硬件控制还是软件控制——实际中软件控制较多

_设置时钟分频因子,fpclk/分频数 = fsck

_设置MSB/LSB先行

_设置CRC校验的表达式


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 1、嵌入式系统的定义 (1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本...
    荣卓然阅读 1,808评论 0 5
  • 什么是嵌入式 IEEE(Institute of Electrical and Electronics Engin...
    Leon_Geo阅读 3,694评论 1 20
  • 在使用单片机的过程中,I2C 通信可以说是最被广泛使用和采纳的协议之一,采用 I2C 协议可以占用更少的资源,链接...
    noparkinghere阅读 2,161评论 0 8
  • ​​​本文主要介绍嵌入式系统的一些基础知识,希望对各位有帮助。 嵌入式系统基础 1、嵌入式系统的定义 (1)定义:...
    OpenJetson阅读 3,297评论 0 13
  • 做单片机开发时UART,SPI和I2C都是我们最经常使用到的硬件接口,我收集了相关的具体材料对这三种接口进行了详细...
    梁睿坤阅读 67,969评论 7 31