主机用SPI1
,从机用SPI2
。目的是主机发送一组数据,从机接受,同时从机返回一组数据,通过串口打印验证。下面是程序。主机SPI
初始#include "
STM32f10x.h"#include "SPI_init.h"#include "sys.h"void SPI1_Configara
tion(void){GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORTA
时钟使能 RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );//SPI1
时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5 | GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP; //
复用推挽输出GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//
初始化GPIOA SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex; //
设置SPI
单向或者双向的数据模式:SPI
设置为双线双向全双工SPI_InitStructure.SPI_Mode =SPI_Mode_Master; //
设置SPI
工作模式:
设置为主SPISPI_InitStructure.SPI_DataSize =SPI_DataSize_8b; //
设置SPI
的数据大小:SPI
发送接收8
位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //
串行同步时钟的空闲状态为高电平SPI_InitStructure.SPI_CPHA =SPI_CPHA_2Edge; //
串行同步时钟的第二个跳变沿(上升或下降)数据被采样SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS
信号由硬件(NSS
管脚)还是软件(使用SSI
位)管理:
内部NSS
信号有SSI
位控制SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_4; //
定义波特率预分频的值:
波特率预分频值为4SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB; //
指定数据传输从MSB
位还是LSB
位开始:
数据传输从MSB
位开始SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC
值计算的多项式SPI_Init(SPI1, &SPI_InitStructure); //
根据SPI_InitStruct
中指定的参数初始化外设SPIx
寄存器 SPI_Cmd(SPI1, ENABLE); //
使能SPI
外设}
主机main
函数#include "stm32f10x.h"#include "SPI_init.h"#include "usart_init.h"#include "delay.h"#include "sys.h"#define buffersize 32u8 SPI1_buffer_TX[buffersize]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20};u8 SPI_buffer_RX[buffersize]={0};u8 TX_Counter=0;u8 RX_Counter=0;u8 k=0;u8 i=0;int main(void){u8 SPI1_RXNE=0; u8 SPI1_TXE=0; delay_init();usart_configuration(115200);SPI1_Configaration();while(TX_Counter<buffersize){while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET); //
检查指定的SPI
标志位设置与否:
发送缓存空标志位 SPI_I2S_SendData(SPI1,SPI1_buffer_TX[TX_Counter]); //
通过外设SPIx
发送一个数据while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET); //
检查指定的SPI
标志位设置与否:
接受缓存非空标志位 SPI_buffer_RX[RX_Counter]=SPI_I2S_ReceiveData(SPI1);//
返回通过SPIx
最近接收的数据TX_Counter++;RX_Counter++;}printf("
SPI1
输出数据如下:
");while(i<buffersize){printf(" %0.2d
",SPI1_buffer_TX
);i++;}printf("
SPI1 收到数据如下:
");while(k<buffersize){printf(" %0.2d
",SPI_buffer_RX[k]);k++;}while(1);}运行结果是主机收到一些无规律的数,从机收到的数全是0。顺便问一下这个过程中自己的几个疑问1、SPI通信时,初始化是,波特率预分频到底是什么,为什么SPI1和SPI2的速度分别为72M和36M,但采用相同的预分频系数,这样两者波特率不同为什么能通信。(事实证明是可以的。)2、对寄存器操作怎么没有效果SPI1->SR&=~(1<<1);3、实验中,我发现TXE位一直是1真心希望得到大家的帮组!!!
一周热门 更多>