看相关教程的过程中,自己搭DEMO过程中遇到些问题点,分享出来,给后来者以借鉴…
常用的SPI通讯方式是标准四线制,如下图电路示意图所示: STM32和74HC595的接线方式为: SPI1_MOSI引脚(PA7)-----74HC595(pin14 SI)相连接 SPI1_MISO引脚(PA6)不接 SPI1_SCK引脚(PA5)-----74HC595(pin11 SCK)相连接 SPI1_NSS引脚(PA4)----74HC595(pin13 ncs)相连接 选择模式为:SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 并在初始化中打开SPI_NSS脚输出功能:SPI_SSOutputCmd(SPI1, ENABLE);这样SPI1_NSS引脚就可以像操作普通IO口一样,输出低电平来选择74HC595芯片。 软件方面,由于程序比较多,就把GPIO配置、SPI配置、和SPI数据发送等相关程序列出来。 void GPIO_Configuration(void) { // PA0-595_nCS(输出) PA1-RCK(输出) PA5-SPI1_SCK(输出) PA6-SPI1-MISO(输入) PA7-SPI1_MOSI(输出) GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //选择PA0 PA1 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//管脚频率为50M GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //按照以上结构体参数值初始化GPIOE寄存器 //SmgA1--PC8(输出) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; //选择PC8 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//管脚频率为50M GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式为推挽输出 GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //选择PB15 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//管脚频率为50M GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式为推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //选择PE8 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//管脚频率为50M GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式为推挽输出 GPIO_Init(GPIOE, &GPIO_InitStructure); //SPI所用管脚的初始化 GPIO_InitStructure.GPIO_Pin= GPIO_Pin_5|GPIO_Pin_7; //选择PA.5,PA.7 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //模式为复用推挽输出 (SPI1) GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA寄存器 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //选择PA6 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//输入模式为浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin= GPIO_Pin_4; //选择PA.4 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式 (SPI1) GPIO_Init(GPIOA, &GPIO_InitStructure); } void SPI_Configuration(void) { /* SPI1 configuration */ SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主机模式 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位数据 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//SPI_CPOL_High=模式3,时钟空闲为高 //SPI_CPOL_Low=模式0,时钟空闲为低 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//SPI_CPHA_2Edge;//SPI_CPHA_1Edge, SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//SPI_NSS_Soft;//SPI_NSS_Hard SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//SPI_BaudRatePrescaler_2=18M;//SPI_BaudRatePrescaler_4=9MHz SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;//数据从高位开始发送 SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); /*Enable SPI1.NSS as a GPIO*/ SPI_SSOutputCmd(SPI1, ENABLE);
/* Enable SPI1 */ SPI_Cmd(SPI1, ENABLE); } GPIO_ResetBits(GPIOA, GPIO_Pin_4);
//--------数码管的控制-------------- while(1) { // i=3; // for(;i<10;) for(i=0;i<10;i++) {
SPI_I2S_SendData(SPI1,tab); // i++; while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); GPIO_ResetBits(GPIOA, GPIO_Pin_1); Delay(10); GPIO_SetBits(GPIOA, GPIO_Pin_1); Delay(10); Delay(1000); } }
|
能运行成功??