范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

STM32硬件SPI主从通信实例

  例子说明及框图
  本例子基于STM32F103ZET6芯片,实现SPI1与SPI2的主从通信。其中SPI1配置为主机,SPI2配置为从机,均配置为全双工模式。硬件连接图:
  其中,我们需要注意的是,SPI的从机不能主动发送数据,只能应答数据。本例子的数据交互过程:
  1、主机使用查询方式发送数据给从机。
  2、从机使用中断接收方式接收数据,把接收到的数据加上0x05再发送给主机。
  从机总是在收到主机的数据时,才会发送数据给从机。即从机被动发送数据,也即主机主动申请数据。
  代码细节
  主函数:int main(void) {        uint8_t i = 0;          //-----------------------------------------------------------------------------------------------      // 上电初始化函数     SysInit();          //-----------------------------------------------------------------------------------------------      // 主程序     while (1)     {         /* 主机发、收数据 */         for (i = 0; i < SPI_BUF_LEN; i++)         {             ucSPI1_RxBuf[i] = SPI1_ReadWriteByte(ucSPI1_TxBuf[i]);         }     }          return 0; }
  其中,ucSPI1_RxBuf与ucSPI1_TxBuf的定义为:uint8_t ucSPI1_RxBuf[SPI_BUF_LEN] = {0}; uint8_t ucSPI1_TxBuf[SPI_BUF_LEN] = {0x01, 0x02, 0x03, 0x04, 0x05};
  SPI1_ReadWriteByte函数为SPI1的读写函数,其作用是往SPI1发送缓冲区写入数据的同时可以读取SPI1接收缓冲区中的数据,其内部实现为:uint8_t SPI1_ReadWriteByte(uint8_t TxData) {                         while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); // 等待发送区空       SPI_I2S_SendData(SPI1, TxData);                                 // 通过外设SPI1发送一个byte数据     while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);// 等待接收完一个byte       return SPI_I2S_ReceiveData(SPI1);                               // 返回通过SPIx最近接收的数据           }
  为什么可以这么写呢?看一下SPI的框图:
  从框图可看出SPI有 2 个缓冲区,一个用于写入(发送缓冲区),一个用于读取(接收缓冲区)。对数据寄存器执行写操作时,数据将写入发送缓冲区,从数据寄存器执行读取时,将返回接收缓冲区中的值。这样写并不会出现读到的数据等于发送的数据。
  SPI2中断函数:void SPI2_IRQHandler(void) {     /* 判断接收缓冲区是否为非空 */     if (SET == SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE))     {         ucSPI2_RxBuf[ucSPI2_RxCount] = SPI2->DR;                         /* 读取接收缓冲区数据 */                                  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);  /* 等待发送区空 */          SPI2->DR = ucSPI2_RxBuf[ucSPI2_RxCount] + 0x05;                  /* 往发送缓冲区填数据 */                  /* 计数器处理 */         ucSPI2_RxCount++;         if (ucSPI2_RxCount > SPI_BUF_LEN - 1)         {             ucSPI2_RxCount = 0;         }                  /* 清中断标志 */         SPI_I2S_ClearITPendingBit(SPI2, SPI_I2S_IT_RXNE);     } }
  从机接收到主机数据后,会加上0x05,再返还给主机。
  SPI1初始化函数:void bsp_SPI1_Init(void) {     /* 定义SPI结构体变量 */     GPIO_InitTypeDef  GPIO_InitStructure;     SPI_InitTypeDef   SPI_InitStructure;          /* SPI的IO口和SPI外设打开时钟 */     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);          /* SPI的IO口设置 */     GPIO_InitStructure.GPIO_Pin = 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); ​     /* SPI的基本配置 */     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_256;// 定义波特率预分频的值:波特率预分频值为256     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外设 }
  SPI1配置为主模式,全双工。
  SPI2初始化函数:void bsp_SPI2_Init(void) {     /* 定义SPI结构体变量 */     GPIO_InitTypeDef  GPIO_InitStructure;     SPI_InitTypeDef  SPI_InitStructure;     NVIC_InitTypeDef NVIC_InitStructure;          /* SPI的IO口和SPI外设打开时钟 */     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);          /* SPI的IO口设置 */     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_Init(GPIOB, &GPIO_InitStructure); ​     /* SPI的基本配置 */     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  // 设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工     SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;      // 设置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_256;// 定义波特率预分频的值:波特率预分频值为256     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;// 指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始     SPI_InitStructure.SPI_CRCPolynomial = 7;          // CRC值计算的多项式     SPI_Init(SPI2, &SPI_InitStructure);               // 根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器          SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);  // 使能接收中断          SPI_Cmd(SPI2, ENABLE);    // 使能SPI2外设          /* NVIC中断控制器配置 */     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         // 中断优先级分组2          NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;         // SPI2中断     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; // 抢占优先级3     NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;       // 子优先级3     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         // IRQ通道使能     NVIC_Init(&NVIC_InitStructure);                         // 根据指定的参数初始化VIC寄存器 }
  SPI2配置为从模式,全双工,使能接收中断。
  验证情况
  可见,与我们前面分析的一致,ucSPI2_RxBuf为从机接收自主机的数据;ucSPI1_RxBuf为主机接收自从机的数据。这里发现ucSPI1_RxBuf的所有数组元素都往后移了一个单位,那是因为主机第一次发送数据给从机的时候,从机并没有数据返还给主机,即此时还没有数据存储在ucSPI1_RxBuf[0]中。

都是姐妹车型,广汽本田和东风本田,有啥区别?本田最早是通过摩托车进入中国市场的,后来才开始搞汽车项目。广汽本田和东风本田总体来看,孰优孰劣并不能笼统地评判。不过从资历车型质量服务等多方面来比较,还是能看出一些区别的。资历本田零下50度汽车能启动吗?惊!这样也行低温对于汽车来说是比较严峻的考验,汽车上很多部件与环境温度有着千丝万缕的关系。不过也不用过于担心,毕竟汽车量产前是经过不同的恶劣环境严格测试过的。只要按正常的标准保养,低温下汽车也英特尔处理器疯狂降价!至强E3第九代测试版仅1300元拼I9鬼知道到底发生了什么?最近的处理器行情,AMD疯狂涨价,连最低端的速龙200GEAPU都230元了?INTEL疯狂降价,连最新上市的10代酷睿I310100F,都开起了519元的小如果长津湖战役发生在现代,零下40度的战场,国产车顶得住吗长津湖战役是抗美援朝时期的第二次战役,是新中国志愿军与包括美国在内的联合国军之间的一场战役,最终以美国为首的联合国军撤退,新中国志愿军在东西两线同时大捷并收复了三八线以北的东部广大500750W四款电脑电源对比测试,1元钱买1W真的靠谱吗本篇文章其实就是一个随机抽取的,比较任性随意的民间PC电源对比测试。参与测试的型号分别为APEXGAMING蓝标650W,型号是AN650MEVGA的白牌700W,型号不会叫(这个158元240G固态硬盘不掉速?慢慢崛起的国产品牌品质不错说起BR这个品牌,可能很多小伙伴们都不知道它的中文名字叫做亿储,既做内存,也做固态硬盘。魔改君偶尔能遇见这个品牌的东西,品质意外的不错,貌似还有专用DDR3内存条。所以对这个品牌一350元500GM2影驰固态硬盘温度永恒26度反人类散热关于固态硬盘的散热片,确实有一部分消费者一直很关注。INTEL方面对于消费级的固态硬盘是完全不加散热片的,但是对于数据中心级以及发烧友级的固态硬盘,比如U2接口和PCIE卡式接口的买车时送的大礼包有哪些坑?哪些值得要?朋友们去买车时,经销商为了能更快促成交易,一般会赠送优惠大礼包。几千甚至上万的大礼包真的这么实在?那得分开看是不是真的那么值得,有的不错,也有的根本不值钱。所谓的大礼包都有哪些种类这玩意居然是世界上最贵的水果?网友你一口就吃下了一辆车的钱众所周知,世界上不同的地方受到地理位置和气候环境的影响不一样,在各地的产物也是存在着很大的不一样的。在世界上,我们人类的生存是离不开饮食的,一般来说我们除了正常的吃饭之外,还有就是15。88万买宝马,首付4万多,月供2085元,轻松圆宝马梦?说实话,大多数国人比较认可的豪华品牌基本上都包括BBA品牌,换句话说,只要是BBA品牌就是豪车。(杠精们,服不服)为什么这么说呢?这主要还是BBA品牌的价格比较离地,即便是入门车型300元英特尔伪I7处理器为何频繁售罄断货?傻瓜轻松超频4G引子先说一个小段子吧(没有任何针对性,只不过是异常误会的悲剧)前阵子出给了一位粉丝一颗INTEL10代带K的酷睿处理器,发货前测试了1。25V超频4。8G,FPU的时候就已经达到了
苏炳添解开了小米的魔咒苏炳添代言小米品牌,着实令人意外又惊喜。但可以看得出,这是一个临时起意且仓促的营销策划。仓促到官宣那天官博只有一张直接用奥运赛场照片刚刚P好的海报。仓促到代言人苏炳添的官宣视频都是黄仁勋发布会全程是数字假人?并非如此只有14秒是合成雷递网乐天8月13日报道昨日,一则黄仁勋骗过了全世界,三个多月都没人发觉!的文章在朋友圈流传,引发外界惊奇。原因是,文章指出,这是一场开在元宇宙里的发布会,发表演讲的是英伟达CEO苹果iPadmini6即将到来,或miniLED屏加持?全面屏已定近期,关于苹果设备的关注点都在即将到来的秋季发布会上,众多果粉期待的iPhone13将会在这次发布会上出现。除此之外,最新的iPadmini也可能会在这场发布会上发布。最近关于最新间谍软件飞马出现,苹果也被植入,为何背后疑点重重?现如今,手机已经成为人手必备的电子产品,随着手机使用频率的增多,手机背后的安全问题,也受到了不少网友的关注,最近欧洲和亚洲一款手机APP被发现存在监控行为,这款APP翻译成中文叫作Apple计划在美国扫描所有iPhone,以查找潜在的非法图像Apple计划在美国扫描所有iPhone,以查找潜在的涉嫌虐待儿童图像。这一举措在安全专家中引起了震动,他们表示这可能使该公司能够出于与保护儿童无关的原因监视手机。一位密码学家说这从第一颗A4到A14,苹果自研芯片的主要变化,你用过哪颗?苹果的A系列处理器,一直是手机上神一样的存在,有时综合性能领先安卓不止一代,如果论单核性能,那么你会发现A芯更是恐怖,苹果的第一颗7nm处理器A12的单核跑分也不比现在安卓鸿蒙手机美国大型科技公司最新薪酬一览,包括谷歌,苹果,微软等原文链接httpsmedium。combusinessinsiderbigtechsalariesrevealedhowmuchyoucanmakeatthebiggestcomp苹果AirPower产品原型机展示!iPhone新专利将消除iPhone刘海8月7日!据消息来源GiulioZompetti在Twitter上分享了一段疑似AirPower原型机的展示,将iPhone置于AirPower上还会有充电动画效果。不过,目前已知强势来袭M1X芯片准备就绪,新品MacBookPro即将上市我是正二品,一个专注提供苹果资讯和苹果回收的平台苹果Mac系列的电脑一直以来都备受广大消费者的关注。随着M1X芯片的热度越来越高,坊间也流传即将推出M1XMacBookPro的传言英特尔下一代NUC12迷你主机曝光有望配备DG2独显IT之家8月7日消息近日英特尔下一代NUC12迷你主机的产品页面被曝光,爆料者是微博用户从未完美过。从图中可见,新款主机采用了六边形的横截面设计,同样支持横放以及纵置放置。从参数上新机未至,定制先行!Caviar推出ZFold3定制版,6。9万起售要说手机厂商中奢侈品牌定制款最多的,肯定是苹果和三星。最近三星刚刚宣布新品发布会定档于8月,就有了非常多关于新机的爆料,更让人意外的是,新机还未发布,Caviar就已经推出了三星G