你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32战舰v3与C8T6工控板SPI通讯实验

[复制链接]
STMCU小助手 发布时间:2022-11-19 22:00
SPI (Serial Peripheral interface)是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

20210217225329376.png

今天分享下,战舰v3与C8T6工控板上的SPI通讯实验,其中战舰v3作为主机,C8T6工控板作为从机。

实验功能说明
程序分别烧录战舰v3和C8T6工控板之后,通过RS232可分别获取战舰v3从C8T6读到的数据以及C8T6从战舰v3读到的数据,并且战舰v3的PB12可以控制与C8T6工控板的SPI通信状态。

硬件部分
1)正点原子战舰v3开发板(下图所示),350¥左右;

20210218134033601.png

2)某宝网上购买的STM32F103C8T6工控板,价格50¥左右;
3)某宝网上购买的232转USB数据线(下图所示),价格15¥左右;
20210114095104289.jpg

4)杜邦线若干,价格几乎为0¥。

硬件连接
按照下表用杜邦线连接好即可。

}64L26_27EWF$)JZH8`00HU.png


部分代码
C8T6工控板的代码可参考互通讯实验中对SPI1的配置,SPI1初始化函数只有一点不同:

  1. SPI_InitStruct.SPI_NSS = SPI_NSS_Hard;  
复制代码

战舰v3代码如下:
1.spi头文件
  1. /**
  2. ********************************  STM32F10x  *********************************
  3. * @文件名称: spi.h
  4. * @作者名称: 闲人Ne
  5. * @摘要简述: SPI头文件
  6. ******************************************************************************/
  7. #ifndef __SPI_H
  8. #define __SPI_H
  9. /* 包含的头文件 --------------------------------------------------------------*/
  10. #include "stm32f10x.h"
  11. /* 函数申明 ------------------------------------------------------------------*/
  12. void SPI2_Init(void);                                   // 初始化SPI2接口
  13. void SPI2_SetSpeed(u8 SpeedSet);                        // 设置SPI2速度   
  14. u8 SPI2_ReadWriteByte(u8 TxData);                       // SPI总线读写一个字节
  15. #endif /* __SPI_H */
  16. /****** Copyright (C)2021 闲人Ne. All Rights Reserved ****** END OF FILE *******/
复制代码

2.spi源文件
  1. /**
  2. ********************************  STM32F10x  *********************************
  3. * @文件名称: spi.c
  4. * @作者名称: 闲人Ne
  5. * @摘要简述: SPI源文件
  6. ******************************************************************************/
  7. /* 包含的头文件 ---------------------------------------------------------------*/
  8. #include "spi.h"
  9. /**************************************************
  10. 函数名称:SPI2_Init()
  11. 函数功能:SPI2初始化函数:配置成主机模式
  12. 入口参数:无
  13. 返回参数:无
  14. 开发作者:闲人Ne
  15. ***************************************************/
  16. void SPI2_Init(void)
  17. {
  18. GPIO_InitTypeDef GPIO_InitStruct;  
  19. SPI_InitTypeDef  SPI_InitStruct;   
  20. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );     // GPIOB时钟使能,选择SPI2,对应PB12,PB13,PB14,PB15
  21. RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2,  ENABLE );     // SPI2时钟使能
  22. // 初始化GPIOB,PB13/14/15都设置复用推挽输出AF_PP,PB14对应MISO,最好设为带上拉输入
  23. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  24. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;  
  25. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  26. GPIO_Init(GPIOB, &GPIO_InitStruct);
  27. GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);    // PB13/14/15置高电平
  28. // 初始化SPI函数
  29. SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   // 设置SPI单向或双向的数据模式:SPI设置为双线双向全双工
  30. SPI_InitStruct.SPI_Mode = SPI_Mode_Master;                        // 针对SPI_CR1寄存器的SSI位和MSTR为,均设置1,即SPI工作模式为主SPI
  31. SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;                    // 针对SPI_CR1寄存器的DFF位,设置数据帧大小为8位
  32. SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;                          // 针对SPI_CR1寄存器的CPOL位,串行同步时钟的空闲状态为高电平
  33. SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;              // 针对SPI_CR1寄存器的CPHA位,串行同步时钟的第二个跳变沿(即上升沿)数据被采样
  34. SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;                            // 针对SPI_CR1寄存器的SSM位,NSS信号由软件(使用SSI位)管理
  35. SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; // 针对SPI_CR1寄存器的BR位,波特率预分频值为256,最低速率
  36. SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;                   // 针对SPI_CR1寄存器的LSBFIRST位,数据传输从MSB位开始
  37. SPI_InitStruct.SPI_CRCPolynomial = 7;                             // 针对SPI_CRCPR寄存器的CRCPOLY位,设为0x0007,为复位值
  38. SPI_Init(SPI2, &SPI_InitStruct);  
  39. SPI_Cmd(SPI2, ENABLE);                                            // 使能SPI外设                             
  40. }
  41. /**************************************************
  42. 函数名称:u8 SPI2_ReadWriteByte(u8 TxData)
  43. 函数功能:读写一个字节函数
  44. 入口参数:TxData:要写入的字节
  45. 返回参数:读取到的字节
  46. 开发作者:闲人Ne
  47. ***************************************************/
  48. u8 SPI2_ReadWriteByte(u8 TxData)
  49. {  
  50. u8 retry=0;
  51. // 检查SPI_SR寄存器的TXE位(发送缓冲为空),其值0时为非空,1时为空
  52. while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET)
  53. {
  54.    retry++;                            // 发送缓冲为空时,retry++
  55.    if(retry>200)return 0;
  56. }     
  57. SPI_I2S_SendData(SPI2, TxData);       // 通过外设SPI2发送一个数据
  58. retry=0;
  59. // 检查SPI_SR寄存器的RXNE位(接收缓冲为空),其值0时为空,1时为非空
  60. while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)
  61. {
  62.    retry++;                            // 当接收缓冲为非空时,retry++
  63.    if(retry>200)return 0;
  64. }            
  65. return SPI_I2S_ReceiveData(SPI2);     // 返回通过SPIx最近接收的数据         
  66. }
  67. /****** Copyright (C)2021 闲人Ne. All Rights Reserved ****** END OF FILE *******/   
复制代码

3.spi_cs头文件
  1. /**
  2. ********************************  STM32F10x  *********************************
  3. * @文件名称: spi_cs.h
  4. * @作者名称: 闲人Ne
  5. * @摘要简述: SPI_CS头文件
  6. ******************************************************************************/
  7. #ifndef __SPI_CS_H
  8. #define __SPI_CS_H
  9. /* 包含的头文件 ---------------------------------------------------------------*/
  10. #include "sys.h"
  11. /* 位操作定义 -----------------------------------------------------------------*/
  12. #define SPI_CS PBout(12)   // PB12
  13. /* 函数申明 -------------------------------------------------------------------*/
  14. void SPI_CS_Init(void);    // 初始化函数
  15. #endif /* __SPI_CS_H */
  16. /****** Copyright (C)2021 闲人Ne. All Rights Reserved ****** END OF FILE *******/
复制代码

4.spi_cs源文件
  1. /**
  2. ********************************  STM32F10x  *********************************
  3. * @文件名称: spi_cs.c
  4. * @作者名称: 闲人Ne
  5. * @摘要简述: SPI_CS源文件
  6. ******************************************************************************/
  7. /* 包含的头文件 --------------------------------------------------------------*/
  8. #include "spi_cs.h"
  9. #include "stm32f10x.h"
  10. /************************************************
  11. 函数名称:SPI_CS_Init()
  12. 函数功能:初始化SPI_CS管脚配置
  13. 入口参数:无
  14. 返回参数:无
  15. 开发作者:闲人Ne
  16. *************************************************/
  17. void SPI_CS_Init(void)
  18. {
  19. GPIO_InitTypeDef  GPIO_InitStruct;
  20. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 使能PB端口时钟
  21. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;                // 选择GPIO引脚12
  22. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;          // 推挽输出
  23. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;         // IO口速度为50MHz
  24. GPIO_Init(GPIOB, &GPIO_InitStruct);            
  25. SPI_CS=0;                                          
  26. }
  27. /****** Copyright (C)2021 闲人Ne. All Rights Reserved ****** END OF FILE *******/
复制代码

5.mian主函数
  1. /**
  2. ********************************  STM32F10x  *********************************
  3. * @文件名称: main.c
  4. * @作者名称: 闲人Ne
  5. * @库版本号: V3.5.0
  6. * @工程版本: V1.0.0
  7. * @开发日期: 2021年2月18日
  8. * @摘要简述: 主函数
  9. ******************************************************************************/
  10. /*-----------------------------------------------------------------------------
  11. * @更新日志:
  12. * @无
  13. * ---------------------------------------------------------------------------*/
  14. /* 包含的头文件 ---------------------------------------------------------------*/
  15. #include "led.h"
  16. #include "key.h"
  17. #include "serial_communication.h"
  18. #include "spi.h"
  19. #include "spi_cs.h"
  20. #include "sys.h"
  21. #include "delay.h"
  22. #include "nvic_configuration.h"
  23. /************************************************
  24. 函数名称:int main()
  25. 函数功能:主函数
  26. 入口参数:无
  27. 返回参数:int
  28. 开发作者:闲人Ne
  29. *************************************************/
  30. u8 key;
  31. u8 spi2_send_data=0;
  32. u8 spi2_receive_data;
  33. int main(void)
  34. {  
  35. NVIC_Configuration();
  36. delay_init();                  
  37. My_USART1_Init();            
  38. LED_Init();  
  39. KEY_Init();   
  40. SPI2_Init();
  41. SPI_CS_Init();
  42. DS0=1;   
  43. DS1=0;
  44. while(1)
  45. {
  46.   key=KEY_Scan(0);         // 有键按下时,key就不为0
  47.   if(key==KEY0_PRES)       // KEY0按下,发送一次数据
  48.   {
  49.    SPI_CS=!SPI_CS;
  50.    DS1=!DS1;
  51.   }
  52.   DS0=!DS0;                // LED0每隔500ms闪烁,提示系统正在运行
  53.   spi2_receive_data = SPI2_ReadWriteByte(spi2_send_data);
  54.   printf("\n战舰v3的SPI2接收到的数据为:%d\r\n",spi2_receive_data);
  55.   spi2_send_data++;
  56.   delay_ms(500);   
  57. }
  58. }
  59. /****** Copyright (C)2021 闲人Ne. All Rights Reserved ****** END OF FILE *******/
复制代码

实验结果
战舰v3实时读到的数据如下图所示,当战舰v3的PB12为0时(即CS=0时),能正确读到从C8T6工控板传来的数据,当按下KEY0键(即CS=1时),则读到的数据稳定在255(不理解,反正是读不到正确数据了)。

20210218140714114.png

C8T6实时读到的数据如下图所示,当战舰v3的PB12为0时(即CS=0时),能正确读到从战舰v3传来的数据,当按下KEY0键(即CS=0时),则读到的数据为0。

2021021814081514.png

经验分享

该程序可作为双芯片之间SPI通讯的参考代码。
————————————————
版权声明:天亮继续睡


收藏 评论0 发布时间:2022-11-19 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版