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

2019-01-09  本文已影响0人  郑行_aover

 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校验的表达式


上一篇下一篇

猜你喜欢

热点阅读