usart&spi

来源:互联网 发布:做淘宝售后几天上手 编辑:程序博客网 时间:2024/06/05 03:30

Usart232 /SPI

(一)  USART:(UniversalSynchronous/Asynchronous Receiver/Transmitter)

通用同步/异步串行接收/发送器

作用:

1、配置成全双工异步系统,与CRT终端和个人计算机等外设进行通信。

2、配置成半双工同步系统,与A/DD/A集成电路和串行EPROM等外设器件进行通信。

(其中包括了电平的转化和数据串并转化)--MAX3232ESE芯片

 

USART三种工作模式:

1.全双工异步模式

2.半双工同步主控模式

3.半双工同步从动模式

 

硬件:

USART收发模块分为三大部分:时钟发生器、数据发送器、接收器。

时钟发生器由同步逻辑电路(在同步从模式下由外部时钟输入驱动)和波特率发生器组成。发送时钟引脚XCK仅用于同步发送模式下,

数据发送器部分由一个单独的写入缓冲器(发送UDR)、一个串行移位寄存器、校验位发生器和用于处理不同桢结构的控制逻辑电路构成。使用写入缓冲器,实现了连续发送多帧数据无延时的通信。

接收器USART模块最复杂的部分,最主要的是时钟和数据接收单元。数据接收单元用作异步数据的接收。除了接收单元,接收器还包括校验位校验器、控制逻辑、移位寄存器和两级接收缓冲器(接收UDR)。接收器支持与发送器相同的桢结构,同时支持桢错误、数据溢出和校验错误的检测

 

 

 

 

 

 

 

 

编程过程:

1、        首先导入头文件GPIOUSARTRCC

2、        系统初始化(系统时间频率):SystemInit();

3、        USART初始化USART1_Config();

(1) USART1GPIO的时钟设置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA,ENABLE);

 

(2) GPIO的设置

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

(初始化两个端口PA9PA10

 

(3)USART1的设置

USART_InitStructure.USART_BaudRate = 115200;

    USART_InitStructure.USART_WordLength =USART_WordLength_8b;

    USART_InitStructure.USART_StopBits =USART_StopBits_1;

    USART_InitStructure.USART_Parity =USART_Parity_No ;

    USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode =USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1,&USART_InitStructure);

  USART_Cmd(USART1,ENABLE);

   

4、        如果想要向PC的超级终端输出信息,有两种方法实现

(1)        printf函数

这需要对printf函数进行重定向,即定向到串口USART1,所需函数fputc

这个函数里的关键句USART_SendData(USART1,(unsigned char) ch);

它实现了将printf的信息发送到串口

           TXE

 

 

 


           RXNE

 

 

 

(2)        USART1_printf函数

实现过程看代码

          

 

SPISerial Peripheral Interface串行外设接口(标准)

左边是主器件,右边是有从器件。

SCLK是时钟信号,由主器件产生。

MOSI主器件数据输出,从器件数据输入。

MISO是主器件数据输入,从器件数据输出。

SS是器件使能信号,低电平有效。

SPI有三个寄存器分别为:控制寄存器 SPCR,状态寄存器SPSR,数据寄存器 SPDR。

外围设备包括FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等

 

编程过程:

1、首先加头文件GPIO,USART,RCC,SPI

2、 USART相似,先系统初始化(时钟频率): SystemInit();

3、 USART设置,与上面提到的一样(这里用到USART是因为要把信息反映在超级终端);

4、 (假若外围设备是FLASH)闪存的初始化: SPI_FLASH_Init();

1)使能GPIOAGPIODSPI的外设时钟,

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOD,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);

2)使能AFIO外设时钟---复用输入输出

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

         3)设置CLK引脚(时钟信号)

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_5;

GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

4)设置MISO引脚(主入从出)

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6;

GPIO_Init(GPIOA,&GPIO_InitStructure);

5)设置MOSI引脚(主出从入)

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_7;

GPIO_Init(GPIOA,&GPIO_InitStructure);

6)设置SS/NSS引脚(使能)

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

(7)取消FLASH选定(通过置使能端高电平)

SPI_FLASH_CS_HIGH();

(8)SPI设置

SPI_InitStructure.SPI_Direction= SPI_Direction_2Lines_FullDuplex;

SPI_InitStructure.SPI_Mode= SPI_Mode_Master;

SPI_InitStructure.SPI_DataSize= SPI_DataSize_8b;

SPI_InitStructure.SPI_CPOL= SPI_CPOL_High;

SPI_InitStructure.SPI_CPHA= SPI_CPHA_2Edge;

SPI_InitStructure.SPI_NSS= SPI_NSS_Soft;

SPI_InitStructure.SPI_BaudRatePrescaler= SPI_BaudRatePrescaler_4;

SPI_InitStructure.SPI_FirstBit= SPI_FirstBit_MSB;

SPI_InitStructure.SPI_CRCPolynomial= 7;

SPI_Init(SPI1,&SPI_InitStructure);

(9)SPI使能

SPI_Cmd(SPI1,ENABLE);

5、往FLASH写入数据

(1)   首先擦除FLASH

SPI_FLASH_SectorErase(FLASH_SectorToErase);

(2)   缓冲区数据写入FLASH

SPI_FLASH_BufferWrite(Tx_Buffer,FLASH_WriteAddress, BufferSize);

(3)   从FLASH读出到缓冲区

SPI_FLASH_BufferRead(Rx_Buffer,FLASH_ReadAddress, BufferSize);

6、结束

SPI_Flash_PowerDown();

 

原创粉丝点击