Usart232 /SPI
(一) USART:(UniversalSynchronous/Asynchronous Receiver/Transmitter)
通用同步/异步串行接收/发送器
作用:
1、配置成全双工异步系统,与CRT 终端和个人计算机等外设进行通信。
2、配置成半双工同步系统,与A/D或D/A集成电路和串行EPROM等外设器件进行通信。
(其中包括了电平的转化和数据串并转化)--MAX3232ESE芯片
USART三种工作模式:
1.全双工异步模式
2.半双工同步主控模式
3.半双工同步从动模式
硬件:
USART收发模块分为三大部分:时钟发生器、数据发送器、接收器。
时钟发生器由同步逻辑电路(在同步从模式下由外部时钟输入驱动)和波特率发生器组成。发送时钟引脚XCK仅用于同步发送模式下,
数据发送器部分由一个单独的写入缓冲器(发送UDR)、一个串行移位寄存器、校验位发生器和用于处理不同桢结构的控制逻辑电路构成。使用写入缓冲器,实现了连续发送多帧数据无延时的通信。
接收器是USART模块最复杂的部分,最主要的是时钟和数据接收单元。数据接收单元用作异步数据的接收。除了接收单元,接收器还包括校验位校验器、控制逻辑、移位寄存器和两级接收缓冲器(接收UDR)。接收器支持与发送器相同的桢结构,同时支持桢错误、数据溢出和校验错误的检测
编程过程:
1、 首先导入头文件GPIO,USART,RCC
2、 系统初始化(系统时间频率):SystemInit();
3、 USART初始化:USART1_Config();
(1) USART1和GPIO的时钟设置
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);
(初始化两个端口PA9和PA10)
(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函数
实现过程看代码
SPI:Serial 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)使能GPIOA和GPIOD、SPI的外设时钟,
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();