找回密码
 注册
关于网站域名变更的通知
查看: 194|回复: 2
打印 上一主题 下一主题

STM32串口SPI主从通信源程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-27 10:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
实现STM32之间的串口通信,设置为主从机。
% \# |- @( p/ f' ], e7 k& V; l . ~# |+ R# [' L8 y$ D" Q, O
, I! a8 A% ]  b6 ~
STM32单片机丛机源程序如下:
$ L  Y3 N3 i. I) M$ ^9 z
  • #include "sys.h" //系统子函数
  • #include "usart.h"//串口子函数
  • #include "delay.h" //延时子函数
  • // SPI总线速度设置
  • #define SPI_SPEED_2   0
  • #define SPI_SPEED_8   1
  • #define SPI_SPEED_16  2
  • #define SPI_SPEED_256 3
  • u8 Slave_Temp=0;
  • void SPI2_Init(void);                         //初始化SPI口
  • void SPI2_SetSpeed(u8 SpeedSet); //设置SPI速度
  • u8 SPI2_ReadWriteByte(u8 TxData);
  • //PB13 SPI2_SCK
  • //PB14 SPI2_MISO
  • //PB15 SPI2_MOSI
  • int main(void)
  • {
  •                  SystemInit();
  •                  delay_init(72);             //延时初始化
  •                  NVIC_Configuration();
  •                  uart_init(9600);//串口初始化为9600
  •                 SPI2_Init(); //SPI2初始化
  •                 SPI2_SetSpeed(SPI_SPEED_256);//SPI2速度两分频
  •                 while(1)
  •                 {
  •                                 //printf("Slave_Temp=%x\r\n",Slave_Temp);
  •                                 delay_ms(100);
  •                 }
  • }
  • //SPI口初始化
  • //这里针是对SPI1的初始化
  • void SPI2_Init(void)
  • {
  •         NVIC_InitTypeDef NVIC_InitStructure;
  •         RCC->APB2ENR|=1<<0; //复用
  •         RCC->APB2ENR|=1<<3;       //PORTB时钟使能
  •         RCC->APB1ENR|=1<<14;      //SPI2时钟使能
  •         //这里只针对SPI口初始化
  •         GPIOB->CRH&=0X000FFFFF;
  •         GPIOB->CRH|=0XBBB00000;//PB13.14.15复用
  •         GPIOB->ODR|=0X7<<13;    //PB13.14.15上拉
  •         SPI2->CR1|=0<<10;//全双工模式
  •         SPI2->CR1|=1<<9; //软件nss管理
  •         SPI2->CR1|=0<<8;//ssi为0
  •         SPI2->CR1|=0<<2; //SPI从机
  •         SPI2->CR1|=0<<11;//8Bit数据格式
  •         SPI2->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
  •         SPI2->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1
  •         SPI2->CR1|=0<<3; //Fsck=Fcpu/256
  •         SPI2->CR1|=0<<7; //MSBfirst
  •         SPI2->CR2|=1<<6;      //接收缓冲区非空中断使能
  •         NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
  •         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  •         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  •         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  •         NVIC_Init(&NVIC_InitStructure);
  •         SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);
  •         SPI_Cmd(SPI2, ENABLE); //使能SPI外设
  • }
  • //SPI 速度设置函数
  • //SpeedSet:
  • //SPI_SPEED_2   2分频   (SPI 12M    --sys 24M)
  • //SPI_SPEED_8   8分频   (SPI 3M     --sys 24M)
  • //SPI_SPEED_16  16分频  (SPI 1.5M    --sys 24M)
  • //SPI_SPEED_256 256分频 (SPI  905.6K --sys 24M)
  • void SPI2_SetSpeed(u8 SpeedSet)
  • {
  •         SPI2->CR1&=0XFFC7;//Fsck=Fcpu/256
  •         IF(SpeedSet==SPI_SPEED_2)//二分频
  •         {
  •                 SPI2->CR1|=0<<3;//Fsck=FPClk/2=36Mhz
  •         }
  •         else if(SpeedSet==SPI_SPEED_8)//八分频
  •         {
  •                 SPI2->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz
  •         }
  •         else if(SpeedSet==SPI_SPEED_16)//十六分频
  •         {
  •                 SPI2->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz
  •         }
  •         else                                  //256分频
  •         {
  •                 SPI2->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz 低速模式
  •         }
  •         SPI2->CR1|=1<<6; //SPI设备使能
  • }
  • u8 SPI2_ReadWriteByte(u8 TxData)
  • {
  •         u8 retry=0;
  •         while((SPI2->SR&1<<1)==0)//等待发送区空
  •         {
  •                 retry++;
  •                 if(retry>200)return 0;
  •         }
  •         SPI2->DR=TxData;                   //发送一个byte
  •         retry=0;
  •         while((SPI2->SR&1<<0)==0) //等待接收完一个byte
  •         {
  •                 retry++;
  •                 if(retry>200)return 0;
  •         }
  •         return SPI2->DR;          //返回收到的数据
  • }
  • u8 SPI2_ReadByte(u8 TxData)
  • {
  •         u8 retry=0;
  • //        while((SPI1->SR&1<<1)==0)//等待发送区空
  • //        {
  • //                retry++;
  • //                if(retry>200)return 0;
  • //        }
  • //        SPI1->DR=TxData;                   //发送一个byte
  • //        retry=0;
  •         while((SPI2->SR&1<<0)==0) //等待接收完一个byte
  •         {
  •                 retry++;
  •                 if(retry>200)return 0;
  •         }
  •         return SPI2->DR;          //返回收到的数据
  • ……………………) e. x1 c3 ^' Y" `4 J7 h0 {7 h0 O% U

AApt64_gJuM119.rar

667.48 KB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

2#
发表于 2022-7-27 13:06 | 只看该作者
分享知识,提高同行之间的技术水平,

该用户从未签到

3#
发表于 2022-7-27 15:12 | 只看该作者
一起互相交流学习,共同进步
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-18 10:00 , Processed in 0.078125 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表