完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
主机用SPI1,从机用SPI2。目的是主机发送一组数据,从机接受,同时从机返回一组数据,通过串口打印验证。下面是程序。 主机SPI初始 #include "STM32f10x.h" #include "SPI_init.h" #include "sys.h" void SPI1_Configaration(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工作模式:设置为主SPI SPI_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; //定义波特率预分频的值:波特率预分频值为4 SPI_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 32 u8 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 { 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("rn SPI1 输出数据如下:rn"); while(i
{ printf(" %0.2d r",SPI1_buffer_TX); i++; } printf("rn SPI1 收到数据如下:rn"); while(k
{ printf(" %0.2d r ",SPI_buffer_RX[k]); k++; } while(1); } 运行结果是主机收到一些无规律的数,从机收到的数全是0。 顺便问一下这个过程中自己的几个疑问 1、SPI通信时,初始化是,波特率预分频到底是什么,为什么SPI1和SPI2的速度分别为72M和36M,但采用相同的预分频系数,这样两者波特率不同为什么能通信。(事实证明是可以的。) 2、对寄存器操作怎么没有效果SPI1->SR&=~(1<<1); 3、实验中,我发现TXE位一直是1 真心希望得到大家的帮组!!! |
|
相关推荐
1个回答
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
702 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1099 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1573 浏览 1 评论
532 浏览 0 评论
1065 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 00:35 , Processed in 0.563575 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号