精华内容
下载资源
问答
  • 在数据通信、计算机网络以及分布式工业控制系统中,经常采用串行通信来交换数据和信息.1969年,美国电子工业协会(EIA)公布了RS-232C作为串行通信接口的电气标准,该标准定义了数据终端设备(DTE)和数据通信设备(DCE)间按...

    在数据通信、计算机网络以及分布式工业控制系统中,经常采用串行通信来交换数据和信息.1969年,美国电子工业协会(EIA)公布了RS-232C作为串行通信接口的电气标准,该标准定义了数据终端设备(DTE)和数据通信设备(DCE)间按位串行传输的接口信息,合理安排了接口的电气信号和机械要求,在世界范围内得到了广泛的应用.但它采用单端驱动非差分接收电路,因而存在着传输距离不太远(最大传输距离15m)和传送速率不太高(最大位速率为20Kb/s)的问题.远距离串行通信必须使用Modem,增加了成本.在分布式控制系统和工业局部网络中,传输距离常介于近距离(<20m)和远距离(>2km)之间的情况,这时RS-232C(25脚连接器)不能采用,用Modem又不经济,因而需要制定新的串行通信接口标准.

    1977年EIA制定了RS-449.它除了保留与RS-232C兼容的特点外,还在提高传输速率,增加传输距离及改进电气特性等方面作了很大努力,并增加了10个控制信号.与RS-449同时推出的还有RS-422和RS-423,它们是RS-449的标准子集.另外,还有RS-485,它是RS-422的变形.RS-422、RS-423是全双工的,而RS-485是半双工的.

    RS-422标准规定采用平衡驱动差分接收电路,提高了数据传输速率(最大位速率为10Mb/s),增加了传输距离(最大传输距离1200m).

    RS-423标准规定采用单端驱动差分接收电路,其电气性能与RS-232C几乎相同,并设计成可连接RS-232C和RS-422.它一端可与RS-422连接,另一端则可与RS-232C连接,提供了一种从旧技术到新技术过渡的手段.同时又提高位速率(最大为300Kb/s)和传输距离(最大为600m).

    因RS-485为半双工的,当用于多站互连时可节省信号线,便于高速、远距离传送.许多智能仪器设备均配有RS-485总线接口,将它们联网也十分方便.

    串行通信由于接线少、成本低,在数据采集和控制系统中得到了广泛的应用,产品也多种多样.

    本文转自:http://cs.nju.edu.cn/yangxc/dcc2003.files/jszc-sub/comif-14.htm

    转载于:https://www.cnblogs.com/jason-lu/articles/3173819.html

    展开全文
  • ArduinoUNOR3主处理器ATMega328P的串行通信子系统可以用于与计算机、外设或其他微控制器进行通信,它支持3种串行通信方式:通用同步/异步收发器,串行外设接口和两线串行接口。 1.通用同步/异步收发器  在串行...

      Arduino UNO R3主处理器ATMega328P的串行通信子系统可以用于与计算机、外设或其他微控制器进行通信,它支持3种串行通信方式:通用同步/异步收发器,串行外设接口和两线串行接口。

    1. 通用同步/异步收发器

      在串行通信中,波特率用来衡量传输速率的快慢,同步和异步的对象是波特率的时钟信号;同步通信的设备之间需要一条额外的时钟线,也因此同步方式可以提供更高的波特率;这里将以异步为例。

      下面的示例可以使通过串口发送给Arduino的数据回显到串口监视器上:

     1 // SerialEcho.ino
     2 char data;
     3 
     4 void setup() {
     5   Serial.begin(9600);
     6 }
     7 
     8 void loop() {
     9   if (Serial.available() > 0) {
    10     data = Serial.read();
    11     Serial.print(data);
    12   }
    13 }

       与通用同步/异步收发器相关的Arduino库函数有:

     

      Serial.begin(speed):打开串口0并设置它的波特率

      speed:串口0的波特率

      Serial.available():判断串口0的缓冲区内是否有数据

      函数返回串口0缓冲区内数据的字节数

      Serial.read():读取串口0输入数据

      函数返回串口0输入数据的一个字节

      Serial.print(val):向串口0打印数据

      val:打印的数据

      Serial.println(val):向串口0打印数据并换行

      val:打印的数据

     

      ATMega328P的串口05个相关寄存器控制,串口0状态和控制寄存器AUCSR0A的结构如下图所示:

    RXC0

    TXC0

    UDRE0

    FE0

    DOR0

    PE0

    U2X0

    MPCM0

    接收完成标志位RXD和数据寄存器空标志位UDRE分别在完成一帧数据接收和发送缓冲区为空时被置为1,可以通过向它们写10

      串口状态和控制寄存器BUCSR0B的结构如下图所示:

    RXCIE0

    TXCIE0

    UDRIE0

    RXEN0

    TXEN0

    UCSZ02

    RXB08

    TXB08

    向接收使能位RXNE或发送使能位TXNE写入1可以分别使能串口0的接收或发送功能。

      串口0控制寄存器CUCSR0C的结构如下图所示:

    URSEL01

    UMSEL00

    UPM01

    UPM00

    USBS0

    UCSZ01

    UCSZ00

    UCPOL0

    向终止位选择控制位USBS0位写入0,则只有1个停止位,写入1则有2个停止位。数据帧长度控制位UCSZ0[2:0]同时存在UCSR0B寄存器和UCSR0C寄存器中,它和奇偶校验模式控制位UPM0[1:0]位的设置如下表所示:

    UCSZ0[2:0]

    数据帧长度

     

    UPM0[1:0]

    奇偶校验模式

    000

    5

     

    00

    无奇偶校验

    001

    6

     

    010

    7

     

    01

    (保留)

    011

    8

     

    100

    (保留)

     

    10

    偶校验

    101

    (保留)

     

    110

    (保留)

     

    11

    奇校验

    111

    9

     

      串口0波特率寄存器(UBRR0HUBRR0L的计算公式是:

      Arduino UNO R3开发板使用8位数据帧长度,1个停止位,无奇偶校验,通过直接访问寄存器改写以上程序为:

     1 // SerialEcho_reg.ino
     2 unsigned char USART0_Receive();
     3 void USART0_Transmit(unsigned char val);
     4 
     5 void setup() {
     6   UCSR0A = 0x20;
     7   UCSR0B = 0x18;
     8   UCSR0C = 0x06;
     9 
    10   UBRR0H = 0x00;
    11   UBRR0L = 0x67;
    12 }
    13 
    14 void loop() {
    15   USART0_Transmit(USART0_Receive());
    16 }
    17 
    18 unsigned char USART0_Receive() {
    19   while (!(UCSR0A & (1 << RXC0)));
    20   return UDR0;
    21 }
    22 
    23 void USART0_Transmit(unsigned char val) {
    24   while (!(UCSR0A & (1 << UDRE0)));
    25   UDR0 = val;
    26 }

     

    2. 串行外设接口

      串行外设接口是一种同步的串行通信方式,因此它需要比通用同步/异步收发器多一条时钟线。此外,串行外设接口还引入了主机和从机的概念,通信中使用的时钟信号由主机产生,从机只有在被主机选中时才能与其进行通信;因此,一个串行外设接口设备一般需要连接4条信号线:SPI时钟SCK,主入从出MISO,主出从入MOSISPI选中SS

    74HC595是一种8位的存储器,它的结构如下图所示:

    11SH_CP)引脚有上升沿产生时,14DS)引脚上的电平信号会被采样,并移入8位移位寄存器中,多余的位将从9Q7’)引脚移出;当12ST_CP)引脚上有上升沿产生,并且13OE)引脚为低电平时,移位寄存器中的内容会被复制到存储寄存器中并输出。

      74HC595芯片不是标准的串行外设接口设备,但可以使用串行外设接口向它输入数据,如图所示连接电路,Arduino开发板11PB3/MOSI)引脚连接到74HC595芯片14DS)引脚,13PB5/SCK)引脚连接到11SH_CP)引脚;74HC595芯片12ST_CP)引脚可以连接到任一Arduino数字引脚,这里是A0PC0)引脚:

      下面的示例代码可以使74HC595芯片连接的LED呈现明暗交替的图案:

     1 // ShiftOutLed.ino
     2 const int DS = 11;
     3 const int SH_CP = 13;
     4 const int ST_CP = A0;
     5 
     6 void setup() {
     7   pinMode(DS, OUTPUT);
     8   pinMode(SH_CP, OUTPUT);
     9   pinMode(ST_CP, OUTPUT);
    10 
    11   digitalWrite(ST_CP, LOW);
    12   shiftOut(DS, SH_CP, MSBFIRST, B10101010);
    13   digitalWrite(ST_CP, HIGH);
    14 }
    15 
    16 void loop() {
    17 }

       与串行外设接口相关的Arduino库函数有:

     

      shiftOut(dataPin, clockPin, bitOrder, value):作为主机移位输出

      dataPin:指定移位输出的引脚

      clockPin:指定同步时钟信号的引脚

      bitOrder:从高位开始发送数据(MSBFIRST)或从低位开始发送数据(LSBFIRST

      val:移位输出的数据

     

      ATMega328P的串行外设接口由2个相关寄存器控制,SPI控制寄存器SPCR的结构如下图所示:

    SPIE

    SPE

    DORD

    MSTR

    CPOL

    CPHA

    SPR1

    SPR0

    SPI使能位SPE写入1则启用串行外设接口,写入0则禁用;数据序列位DORD位写入1则从SPI数据寄存器SPDR的高位开始发送,写入0则从低位开始发送;时钟相位位CPHA写入1则数据在上升沿采样,写入0则在下降沿采样。此外,Arduino作为主机,则主/从选择位MSTR需写入1

      SPI状态寄存器SPSR的结构如下图所示:

    SPIF

    WCOL

     

     

     

     

     

    SPI2X

    SPI2X位与SPCR寄存器中的SPR[1:0]位共同设定SPI的分频系数,如下表所示:

    SPI2X

    SPR[1:0]

    时钟源

    0

    00

    系统时钟4分频

    0

    01

    系统时钟16分频

    0

    10

    系统时钟64分频

    0

    11

    系统时钟128分频

    1

    00

    系统时钟2分频

    1

    01

    系统时钟8分频

    1

    10

    系统时钟32分频

    1

    11

    系统时钟64分频

      通过直接访问寄存器改写以上程序为:

     1 // ShiftOutLed_reg.ino
     2 void setup() {
     3   DDRB |= (1 << PB3) | (1 << PB5);
     4   DDRC |= (1 << PC0);
     5   
     6   PORTC &= ~(1 << PC0);
     7   SPCR = 0x77;
     8   SPDR = 0xaa;
     9   PORTC |= (1 << PC0);
    10 }
    11 
    12 void loop() {
    13 }

    3. 两线串行接口

      两线串行接口同样也是一种同步的串行通信方式,它的读和写时序如下图所示:

      

      

    由于主机先发送从机地址,从机应答后再发送其他数据,因此两线串行接口不需要类似于串行外设接口的选择信号线;又因为采用半双工的通信方式,两线串行接口只需要一条数据线,所以一个两线串行接口设备一般只需要2条信号线,即时钟信号线SCL和数据信号线SDA

      两线串行接口可以工作在主机发送模式,主机接收模式,从机发送模式或从机接收模式,Arduino IDEWire库提供了这四种模式的示例,我们主要关注主机发送模式和主机接收模式,下面是这两个示例:

     1 // master_writer.ino
     2 #include <Wire.h>
     3 
     4 void setup() {
     5   Wire.begin();
     6 }
     7 
     8 byte x = 0;
     9 
    10 void loop() {
    11   Wire.beginTransmission(8);
    12   Wire.write("x is ");
    13   Wire.write(x);
    14   Wire.endTransmission();
    15 
    16   x++;
    17   delay(500);
    18 }
    19 
    20 // master_reader.ino
    21 #include <Wire.h>
    22 
    23 void setup() {
    24   Wire.begin();
    25   Serial.begin(9600);
    26 }
    27 
    28 void loop() {
    29   Wire.requestFrom(8, 6);
    30 
    31   while (Wire.available()) {
    32     char c = Wire.read();
    33     Serial.print(c);
    34   }
    35 
    36   delay(500);
    37 }

       与两线串行接口主机相关的Arduino库函数有:

     

      Wire.begin():作为主机打开两线串行接口

      Wire.beginTransmission(address):开始向指定地址从机传输数据

      address:指定从机的地址

      Wire.write(val):向从机发送数据

      val:发送的数据

      Wire.endTransmission():结束向从机发送数据

      Wire.requestFrom(address, quantity):向指定地址从机请求指定字节数的数据

      address:指定从机的地址

      quantity:指定请求的字节数

      Wire.available():判断两线串行接口的缓冲区内是否有数据

      函数返回两线串行接口缓冲区内数据的字节数

      Wire.read():读取两线串行接口输入的数据

      函数返回两线串行接口输入数据的一个字节

     

      ATMega328P的两线串行接口的主机模式由3个相关寄存器控制。两线串行接口波特率寄存器TWBR的计算公式是:


    其中,TWPS是预分频系数,它由两线串行接口状态寄存器TWSR中的TWPS[1:0]位设置,寄存器的结构如下图所示:

    TWS7

    TWS6

    TWS5

    TWS4

    TWS3

     

    TWPS1

    TWPS0

      两线串行接口控制寄存器TWCR的结构如下图所示:

    TWINT

    TWEA

    TWSTA

    TWSTO

    TWWC

    TWEN

     

    TWIE

    TWI使能位TWEN写入1则启用两线串行接口,写入0则禁用;向起始信号使能位TWSTA或停止信号使能位TWSTO写入1,则会产生起始信号或停止信号,停止条件产生后,TWSTO位会自动清零。

      TWI中断标志位被置1表示产生了相关事件的中断,通过判断TWSR寄存器高5位的值可以判断中断事件,如下表所示:

    主机发送模式(TWPS[1:0] = 00

    主机接收模式(TWPS[1:0] = 00

    状态码

    状态

    状态码

    状态

    0x08

    START已发送

    0x08

    SATRT已发送

    0x10

    重复START已发送

    0x10

    重复START已发送

    0x18

    SLA+W已发送,接收到ACK

    0x38

    SLA+RNOT ACK仲裁失败

    0x20

    SLA+W已发送,接收到NOT ACK

    0x40

    SLA+R已发送,接收到ACK

    0x28

    数据已发送,接收到ACK

    0x48

    SLA+R已发送,接收到NOT ACK

    0x30

    数据已发送,接收到NOT ACK

    0x50

    接收到数据,已产生ACK

    0x38

    SLA+W或数据的仲裁失败

    0x58

    接收到数据,已产生NOT ACK

      通过直接访问寄存器改写以上程序为:

      1 // master_writer_reg.ino
      2 #define READ        0x01
      3 #define WRITE        0x00
      4 void twi_write(byte address, byte val);
      5 
      6 void setup() {
      7   TWSR &= ~(1 << TWPS1) & ~(1 << TWPS0);
      8   TWBR = 0x48;
      9 }
     10 
     11 byte x = 0;
     12 
     13 void loop() {
     14   twi_write(8, x);
     15 
     16   x++;
     17   delay(500);
     18 }
     19 
     20 void twi_write(byte address, byte val) {
     21   // 发送开始
     22   TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
     23   while (!(TWCR & (1 << TWINT)));
     24   if ((TWSR & 0xf8) != 0x08) {
     25     TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
     26     return;
     27   }
     28 
     29   // 发送从机地址
     30   TWDR = (address << 1) | WRITE;
     31   TWCR = (1 << TWINT) | (1 << TWEN);
     32   while (!(TWCR & (1 << TWINT)));
     33   if ((TWSR & 0xf8) != 0x18) {
     34     TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
     35     return;
     36   }
     37 
     38   // 发送数据
     39   TWDR = val;
     40   TWCR = (1 << TWINT) | (1 << TWEN);
     41   while (!(TWCR & (1 << TWINT)));
     42   if ((TWSR & 0xf8) != 0x28) {
     43     TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
     44     return;
     45   }
     46 
     47   // 发送停止
     48   TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
     49 }
     50 
     51 // master_reader_reg.ino
     52 #define READ        0x01
     53 #define WRITE        0x00
     54 
     55 byte data;
     56 void twi_read(byte address);
     57 
     58 void setup() {
     59   TWSR &= ~(1 << TWPS1) & ~(1 << TWPS0);
     60   TWBR = 0x48;
     61 
     62   Serial.begin(9600);
     63 }
     64 
     65 void loop() {
     66   twi_read(8);
     67   Serial.print(data);
     68 
     69   delay(500);
     70 }
     71 
     72 void twi_read(byte address) {
     73   // 发送开始
     74   TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
     75   while (!(TWCR & (1 << TWINT)));
     76   if ((TWSR & 0xf8) != 0x08) {
     77     TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
     78     return;
     79   }
     80 
     81   // 发送从机地址(伪写)
     82   TWDR = (address << 1) | WRITE;
     83   TWCR = (1 << TWINT) | (1 << TWEN);
     84   while (!(TWCR & (1 << TWINT)));
     85   if ((TWSR & 0xf8) != 0x18) {
     86     TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
     87     return;
     88   }
     89 
     90   // 发送重复开始
     91   TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
     92   while (!(TWCR & (1 << TWINT)));
     93   if ((TWSR & 0xf8) != 0x10) {
     94     TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
     95     return;
     96   }
     97 
     98   // 发送从机地址(读)
     99   TWDR = (address << 1) | READ;
    100   TWCR = (1 << TWINT) | (1 << TWEN);
    101   while (!(TWCR & (1 << TWINT)));
    102   if ((TWSR & 0xf8) != 0x40) {
    103     TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
    104     return;
    105   }
    106 
    107   // 读取数据
    108   TWCR = (1 << TWINT) | (1 << TWEN);
    109   while (!(TWCR & (1 << TWINT)));
    110   if ((TWSR & 0xf8) != 0x58) {
    111     TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
    112     return;
    113   }
    114   data = TWDR;
    115 
    116   // 发送停止
    117   TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
    118 }

    转载于:https://www.cnblogs.com/lets-blu/p/7525073.html

    展开全文
  • 51单片机内部集成1~2个可编程通用异步串行通信接口(即UART),采用全双工制式。该通信接口四种工作方式,并且 能设置各种波特率 串行口结构 1、串行口数据缓存器SBUF用于存放发送/接收数据,它在物理上是同...

     51单片机内部集成1~2个可编程通用异步串行通信接口(即UART),采用全双工制式。该通信接口有四种工作方式,并且
     能设置各种波特率
    

    串行口结构

    在这里插入图片描述
    1、串行口数据缓存器SBUF用于存放发送/接收的数据,它在物理上是同一个寄存器,逻辑上是两个
    2、串行口寄存器SCON用于控制串行口的工作方式
    3、波特率发生器由定时器T1构成
    4、波特率于单片机的晶振频率、定时器T1初值、串行口的工作方式以及波特率选择位SMOD有关

    设置工作方式(串行口控制寄存器SCON)

     可位寻址
    
    D7 D6 D5 D4 D3 D2 D1 D0
    SM0 SM1 SM2 REN TB8 RB8 TI RI
    SM0 SM1 工作方式 功能 波特率
    0 0 方式0 8位同步移位寄存器 Fosc/12
    0 1 方式1 10位UART 可变
    1 0 方式2 11位UART Fosc/64 或 Fosc/32
    1 1 方式3 11位UART 可变
    控制位 功能 说明
    SM2 多机通信控制位 (空)
    REN 允许串行接收位 REN=1时,允许接收;REN=0时,禁止接收
    TB8 发送数据第九位 (空)
    RB8 接收数据第九位 (空)
    TI 发送中断标志位 发送完一帧数据的标志,由硬件置位,软件清零
    RI 接收中断标志位 接收完一帧数据的标志,由硬件置位,软件清零

    进行单机通信了解上面的就够使用了,(空)的以后再补充

    设置波特率

    本人只用过工作方式1,所以这里只介绍工作方式1
    

    =2SMODT1/32 波特率 = 2^{SMOD}*(T1溢出率)/ 32

    T1=Fosc/(12(256)) T1溢出率 = Fosc/(12*(256-初值))

    T1=256Fosc2SMOD/(1232) T1初值 = 256 - Fosc*2^{SMOD}/(12*波特率*32)
    公式中256哪里来:上面说到方式一的10位UART 是:1位起始位,8位数据位(二进制),1位停止位,所以计数最大值为
    M=28=256 M = 2^8 = 256

    展开全文
  • 微控制器与外设之间数据通信,根据连线结构和传送方式不同,可以分为两:并行通信和串行通信。 并行通信:指数据各位同时发送或接收,每个数据位使用单独一条导线。传输速度快、效率高,但需要数据线较...

    并行通信与串行通信

    微控制器与外设之间的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。
    并行通信:指数据的各位同时发送或接收,每个数据位使用单独的一条导线。传输速度快、效率高,但需要的数据线较多,成本高。
    串行通信:指数据一位接一位地顺 序发送或接收。需要的数据线少,成本低,但传输速度慢,效率低。

    从中我们可以了解到两种通信方式各有各自的优缺点,在实际应用中根据不同情况而定。

    CC2530的串口通信模块

    CC2530有两个串行通信接口USART0USART1,并且它们都能够分别运行于异步UART模式或者同步SPI模式。具体用于那种模式通过设置U0CSR寄存器来选择。
    两个USART接口具有相同的功能,且它们有对应的外部I/O引脚映射关系。通过
    PERCFG寄存器设置。
    映射关系:
    位置1RX0 — P0_2 TX0 — P0_3 RX1 — P0_5 TX1 — P0_4
    位置2RX0 — P1_4 TX0 — P1_5 RX1 — P1_7 TX1 — P1_6

    对每个USART串口通信编程,本质是设置相关的5个寄存器:
    <1> UxCSR: USARTx的控制和状态寄存器。
    <2> UxUCR: USARTx的UART控制寄存器。
    <3> UxGCR: USARTx的通用控制寄存器。
    <4> UxDBUF:USARTx的接收/发送数据缓冲寄存器。
    <5> UxBAUD:USARTx的波特率控制寄存器。

    相关寄存器介绍

    接下来的代码部分会涉及到一些寄存器的各个位作用

    CLKCONCMD:时钟频率控制寄存器。
    在这里插入图片描述
    D7位为32KHZ时间振荡器选择,,0为32KRC震荡,1为32K晶振。默认为1。
    D6位为系统时钟选择。0为32M晶振,1为16M RC震荡。当D7位为0时D6必须为1。
    D5~D3为定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。默认为001。需要注意的是:当D6为1时,定时器频率最高可采用频率为16MHZ。
    D2~D0:系统主时钟选择:000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。当D6为1时,系统主时钟最高可采用频率为16MHZ。

    CLKCONSTA:时间频率状态寄存器。
    在这里插入图片描述
    D7位为当前32KHZ时间振荡器频率。0为32KRC震荡,1为32K晶振。
    D6位为当前系统时钟选择。0为32M晶振,1为16M RC震荡。
    D5~D3为当前定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。
    D2~D0为当前系统主时钟。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。

    PERCFG:设置部分外设的I/O位置,0为默认I位置1,1为默认位置2
    在这里插入图片描述
    U0CSR:USART0控制与状态;
    在这里插入图片描述
    D7为工作模式选择,0为SPI模式,1为USART模式
    D6为UART接收器使能,0为禁用接收器,1为接收器使能。
    D5为SPI主/从模式选择,0为SPI主模式,1为SPI从模式。
    D4为帧错误检测状态,0为无错误,1为出现出错。
    D3为奇偶错误检测,0为无错误出现,1为出现奇偶校验错误。
    D2为字节接收状态,0为没有收到字节,1为准备好接收字节。
    D1为字节传送状态,0为字节没有被传送,1为写到数据缓冲区的字节已经被发送。
    D0为USART接收/传送主动状态,0为USART空闲,1为USART忙碌。

    U0GCR:USART0通用控制寄存器;
    在这里插入图片描述
    D7为SPI时钟极性:0为负时钟极性,1为正时钟极性;
    D6为SPI时钟相位:
    D5为传送为顺序:0为最低有效位先传送,1为最高有效位先传送。
    D4~D0为波特率设置:
    对于波特率设置我们这还有介绍:
    CC2530的波特率由BAUD_E和BAUD_M共同决定:
    在这里插入图片描述
    F为微控制器的系统时钟频率:16MHz或32MHz。
    在TI公司提供的数据手册中,给出了32MHz系统时钟下各常用波特率的参数值,由计算公式亦不难得出16MHz系统时钟下对应的参数值。
    在这里插入图片描述

    UART口与计算机的COM口连接

    先认识两种电平:TTL电平和RS232电平。
    TTL电平逻辑0----小于0.8V 逻辑1----大于2.4V。
    RS232电平逻辑0----5~15V 逻辑1---- -5~-15V。

    计算机的串行通信接口是RS-232的标准接口,而CC2530单片机的UART接口则是TTL电平,两者的电气规范不一致,所以要完成两者之间的数据通信,就需要借助接口芯片在两者之间进行电平转换,常用的有MAX232芯片。
    在这里插入图片描述
    注意:DB9接口中,公头和母头的排列顺序是不同的

    串口小实验

    这次小实验做的是CC2530串口0与串口助手连接,在32HMz的内部系统时钟下产生19200的波特率。从串口助手发送一个字符或者一个字符串到开发板,开发板又将收到的字符或者字符串回送到串口助手上。
    设计思路:
    <1> 初始化USART0口的各个寄存器
    <2> 设计字节发送函数
    <3> 设计接收完成中断服务函数
    <4> 解析接收到的数据并执行相对应的操作

    串口0初始化函数

    选择外设的引脚映射位置,并将对应的引脚设置为外设功能 ,然后对波特率、控制寄存器和中断的相关控制位进行设置。

    void initUART(void)
    {
      CLKCONCMD &= ~0x40;  //设置系统时钟源为32MHz晶振
      while(CLKCONSTA & 0x40);//等待晶振稳定
      CLKCONCMD &= ~0x47;//设置系统主时钟频率为32MHz
      
      PERCFG=0x00;  //选择位置1即P0_2,P0_3
      P0SEL=0x0c; //将P0_2,P0_3口设置为外设功能
      U0CSR |= 0xc0; //串口设置为UART异步通信模式并使能接收器
      U0GCR |=9;
      U0BAUD |=59;  //设置波特率为19200
      UTX0IF = 0; //UART0 TX中断标志初始置位1
      URX0IF = 0; //UART0 RX中断标志初始置位1
      //U0CSR |=0x40; //允许接收
      //IEN0 |=0x84;//开总中断,接收中断
      URX0IE = 1;//使能URAT0接收中断
      EA = 1; //使能总中断
    }
    

    数据接收中断服务函数

    #pragma vector =URX0_VECTOR
    __interrupt void UART0_ISR(void)
    {
      URX0IF = 0;  //清中断标志
      temp = U0DBUF;
      RxFlag=1;//接收标志置为1
    }
    

    发送字节函数

    void UartTX_Send_char(uchar Data)
    {
      U0DBUF = Data;
      while(UTX0IF==0);   //当发送成功标志位置为1后退出等待
      UTX0IF=0; //软件清除发送标志
    }
    

    实验源代码

    #include "iocc2530.h"
    #include<string.h>
    #define uchar unsigned char
    #define uint unsigned int
    //函数申明
    void initUART(void);//初始化串口
    void UartTX_Send_char(uchar Data);//发送字符
    
    uchar temp;
    uchar RxFlag=0;
    //串口初始化
    void initUART(void)
    {
      CLKCONCMD &= ~0x40;  //设置系统时钟源为32MHz晶振
      while(CLKCONSTA & 0x40);//等待晶振稳定
      CLKCONCMD &= ~0x47;//设置系统主时钟频率为32MHz
      
      PERCFG=0x00;  //选择位置1即P0_2,P0_3
      P0SEL=0x3c; //将P0_2,P0_3口设置为外设功能
      U0CSR |= 0xc0; //串口设置为UART异步通信模式并使能接收器
      U0GCR |=9;
      U0BAUD |=59;  //设置波特率为19200
      UTX0IF = 0; //UART0 TX中断标志初始置位1
      URX0IF = 0; //UART0 RX中断标志初始置位1
      //U0CSR |=0x40; //允许接收
      //IEN0 |=0x84;//开总中断,接收中断
      URX0IE = 1;//使能URAT0接收中断
      EA = 1; //使能总中断
    }
    void UartTX_Send_char(uchar Data)
    {
      U0DBUF = Data;
      while(UTX0IF==0);   //当发送成功标志位置为1后退出等待
      UTX0IF=0; //软件清除发送标志
    }
    //串口中断函数
    #pragma vector =URX0_VECTOR
    __interrupt void UART0_ISR(void)
    {
      URX0IF = 0;  //清中断标志
      temp = U0DBUF;
      RxFlag=1;//接收标志置为1
    }  
    void main(void)
    {
      initUART();
      while(1)
      {
        if(RxFlag==1)
        {
          UartTX_Send_char(temp);
          RxFlag=0;
        }
      }
    }
    

    本次介绍就到这了,谢谢大家的观看!

    展开全文
  • SPI,是一高速,全双工,同步的通信总线,并且在芯片管脚上只占用根线,节约了芯片管脚,同时为 PCB 布局上节省空间,提供方便,正是出于这种简单易用特性,现在越来越多芯片集成了这种通信协议,S
  • 它将要传输资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号芯片,UART通常被集成于其他通讯接口的连结上。 uART使用标准CMOS逻辑电平(0~5v、0~3.3 V、0~2.5V或0~1.8V四种)来...
  • SPI 串行外设接口

    2020-07-10 16:46:32
    串行外设接口(Serial Peripheral Interface Bus)SPI是一用于芯片通信的同步串行通信接口规范,主要应用于单片机系统中。类似I²C。 由摩托罗拉公司于20世纪80年代中期开发,后发展成了行业规范。它的典型应用有...
  • AT89S52单片机串行口有方式0、方式1、方式2、方式3四种工作方式。方式0主要用于扩展并行输入输出口,方式1、2、3用于串行通信
  • SPI串行外设接口

    2018-10-25 21:46:49
    SPI 是一同步、全双工、串行通信方式,数据发送或接受根据时钟上升沿或者下降沿, 主机和从机可以同时进行数据收发。 SPI接口可以是线也可以是三线,三线其实是半双工MOSI和MISO合并成一条SIO SPI主机...
  • 其中串行外设接口(Serial Peripheral InteRFace)是Motorola公司提出同步串行外围接口协议.主要应用在EEPROM、FLASH、实时时钟、AD转换器.还有数字处理和数字解码器之间。包括主/从2模式,具有I/O资源占用...
  • SPI,是一高速,全双工,同步的通信总线,并且在芯片管脚上只占用根线,节约了芯片管脚,同时为PCB布局上节省空间,提供方便,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字...
  • SPI串行外围设备接口

    千次阅读 2017-04-23 20:04:01
    串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出同步串行接口。 SPI 用 于CPU与各种外围器件进行全双工、同步串行通讯。它只需条线就可以完成MCU与各种外围器件通讯,这...
  • 是一标准的四线同步双向串行总线。  SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,...
  • 常用高速逻辑电平: LVDC 低电压差分信号,又称RS644总线接口。最基本LVDS器件就是LVDS驱动器和接收器。LVDS驱动器有驱动差分线对电流源...在应用模式可以分四种: 单向点对点; 双向对点;能通过一条双绞线实现
  • 经常IIC和SPI接口被认为指定是一硬件设备,但其实这样说法是不尽准确,严格说他们都是人们所定义软硬结合体,分为物理层(线结构)和协议层(主机,从机,时钟极性,时钟相位)。 常见物理接
  • 是一高速,全双工,同步的通信总线,并且在芯片管脚上只占用根线,节约了芯片管脚,同时为PCB布局上节省空间,提供方便,正是出于这种简单易用特性,现在越来越多芯片集成了这种通信协议。 许多...
  • 1、SPI,是一高速,全双工,同步的通信总线,并且在芯片管脚上只占用根线。 2、SPI 接口一般使用 4 条线通信: MISO 主设备数据输入,从设备数据输出。 MOSI 主设备数据输出,从设备数据输入。 SCLK ...
  • 那么今天再看看SPI是怎么回事,其实,他跟IIC一样都是一种通信协议,翻译过来就是串行外围设备接口,一般是用在像ADC,LCD等设备与MCU间这种要求通讯速率较高场合;因为是全双功,他用到线路有根,分别是SCK,...
  • SPI,是一高速,全双工,同步的通信总线,并且在芯片管脚上只占用根线,节约了芯片管脚,同时为PCB布局上节省空间,提供方便,正是出于这种简单易用特性,现在越来越多芯片集成了这种通信协议。
  • SPI,是一高速,全双工,同步的通信总线,并且在芯片管脚上只占用根线,节约了芯片管脚,同时为PCB布局上节省空间,提供方便,正是出于这种简单易用特性,现在越来越多芯片集成了这种通信协议。...
  • SPI(Serial Peripheral Interface,串行外围设备接口),是Motorola公司提出同步串行接口技术,是一高速、全双工、同步通信总线,在芯片中只占用根管脚用来控制及数据传输,广泛用于EEPROM、Flash、RTC...
  • 通信专栏】:485通信详解

    千次阅读 2020-01-28 13:01:42
    串行通信是指一比特一比特收发数据,相对于并行通信可一次性收发N比特而言。所以串行或者并行通信都是一概念,是理论层面。 并行接口: 串行接口:串行接口必须为GND,RXD,TXD三条线,其余几条作为握手用...
  • 是Motorola首先在其MC68HCXX系列处理器上定义,用来做MCU与外设之间的通信接口。【SPI接口信号】如表1所示,SPI接口总共包含根信号线。表1 SPI接口信号【SPI应用框图】图1 SPI应用框图图1为SPI典型应用框图,SPI...
  • SPI接口通信协议

    2019-04-26 10:11:52
    SPI接口主要应用在 EEPROM、FLASH、传感器、实时时钟、AD转换器,还有数字信号处理器和数字信号解码器之间,是一全双工同步的通信总线,并且在芯片管脚上只占用根线,如今越来越多芯片集成了这种通信协议。...
  • 本平台目前集成了SPI、One-wire、Microware、I2C四种串行接口,在今后使用中,可根据需要增加串行接口的种类。 1 串行扩展平台结构SPI、One-wire、Microwa
  • SPI(Serial Peripheral Interface,串行外围设备接口)是一全双工、同步通信总线,在芯片中只占用根管脚用来控制及数据传输,广泛用于EEPROM、Flash、RTC(实时时钟)、ADC(数模转换器)、DSP(数字信号处理器...
  • 来说,UART用在与主机(比如...最早是没有统一的串行接口标准,各个公司在自己领域分别提出来,最终成为了通用标准。这些协议分别用在不同的通信,分别完成不通功能。就像人体内有很多肌肉。但由于...
  • SPI是由Motorola公司提出一种同步串行外围接口;它在速度要求不高,低功耗,需要保存少量参数智能... 通信四种模式: 1、MISO(Master In Slave Out) 主机输入,从机输出; 2、MOSI(Master Out Slave In) 主机...
  • STM32通信接口(三)硬件SPI

    万次阅读 2018-05-03 21:49:03
    SPI,是一高速,全双工,同步的通信总线,是Motorola最先在其MC68HCXX芯片上使用,并且在芯片管脚上只占用根线,节约了芯片管脚,同时为PCB布局上节省空间,提供方便,正是出于这种简单易用特性,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 544
精华内容 217
关键字:

串行通信的四种接口