OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4162|回复: 6

stm32spi单线接收外设的问题

[复制链接]

0

主题

16

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2021-10-6
在线时间
4 小时
发表于 2021-10-6 11:37:01 | 显示全部楼层 |阅读模式
4金钱
本帖最后由 xiayuu 于 2021-10-8 10:26 编辑

因为外置传感器是单线的(只能向外发送数据),所以用了stm32的SPI2做单线双向接收。但是现在接收不到数据,不知道为什么,希望有人帮帮我。
时钟信号我设置的APB1是36M,下面是我初始化的程序。
  1. <div class="blockcode"><blockquote>void Rcc_Init(void)
  2. {
  3.         RCC_DeInit();
  4.         RCC_HSEConfig(RCC_HSE_ON);                                                                                                                //OPEN_HSE
  5.         while(!(RCC->CR>>17));
  6.         RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);        //SYSTEMCLK:9*8=72M
  7.         RCC_HCLKConfig(RCC_SYSCLK_Div1);                                                                                        //AHB: 72/1=48M
  8.         RCC_PCLK1Config(RCC_HCLK_Div4);                                                                                                //APB1:72/4=18M
  9.         RCC_PCLK2Config(RCC_HCLK_Div1);                                                                                                //APB2:72/1=72MS
  10.         RCC_PLLCmd(ENABLE);
  11.         while(!(RCC->CR>>25));
  12.         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                                                //set_pll=sysclk
  13.         while(RCC_GetSYSCLKSource() != 0x08);                                                                        
  14. }
  15. void SPI2_Init(void)
  16. {
  17.         GPIO_InitTypeDef GPIO_InitStructure;
  18.          SPI_InitTypeDef  SPI_InitStructure;
  19.     /*使能时钟信号*/
  20.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD, ENABLE );//PORTB时钟使能
  21.         RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能         
  22.     /*SPI2 definated pin*/
  23.         
  24.                                                                 /*CLK*/        
  25.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  26.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                //复用推挽输出
  27.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  28.                                                                 /*SO*/        
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  30.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                //上拉输入
  31.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  32.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                //初始化GPIOB
  33.         /*user definated pin*/
  34.                                                         /*CS1*/
  35.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  36.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
  37.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  38.         GPIO_Init(GPIOD, &GPIO_InitStructure);


  39.   
  40.         GPIO_ResetBits(GPIOB,GPIO_Pin_13);                  //时钟信号空闲位:低                                                                        
  41.         GPIO_SetBits(GPIOB,GPIO_Pin_14);
  42.         GPIO_SetBits(GPIOD,GPIO_Pin_3);               
  43.     /*SPI2初始化*/
  44.         SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx;  //设置SPI为单线双向接收
  45.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                           //设置为主机
  46.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                   //设置SPI输出大小:接收8位帧数据
  47.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                                   //串口同步时钟空闲位为低电平
  48.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                           //上升沿采样
  49.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                   //NSS信号由软件控制
  50.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //波特率预分频值256
  51.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                        //数据传输从MSB位开始
  52.         SPI_InitStructure.SPI_CRCPolynomial = 7;                                        //CRC计算多项式
  53.         SPI_Init(SPI2, &SPI_InitStructure);                                                  //初始化寄存器
  54.   
  55. }
复制代码

下面这段是读取数据,但是一直没有读到数据
  1. <div class="blockcode"><blockquote>void SPI2_ReadWriteByte(void)
  2. {       
  3.         while (SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == SET)
  4.         {
  5.                 switch(count)
  6.                 {
  7.                         case 0:
  8.                                 read_byte=SPI_I2S_ReceiveData(SPI2); //读低八位
  9.                                 rec_data=(uint16_t)read_byte;
  10.                                 count=1;
  11.                                 break;
  12.                         case 1:
  13.                                 read_byte=SPI_I2S_ReceiveData(SPI2); //高八位
  14.                                 rec_data|=((uint16_t)read_byte<<8);
  15.                                 count=2;         
  16.                                 break;
  17.                 }
  18.                 if(count==2)
  19.                 {
  20.                         SPI_CS_SET;                            //取消片选
  21.                         Delay_us(1);
  22.                 }            
  23.         }       
  24. }
  25.        
  26. void SPI_ReadSR(void)   
  27. {       
  28.         if(count==0)
  29.         {
  30.                 SPI_CS_CLR;                        //拉低片选
  31.         Delay_us(3);
  32.                 SPI_Cmd(SPI2, ENABLE);               
  33.         }
  34.         if(count<2)
  35.         {
  36.                 SPI2_ReadWriteByte();                             //获取一个字节
  37.         }
  38.         else
  39.         {
  40.                 count=0;
  41.                 start_byte=1;
  42.         }
  43. }
复制代码


下面是传感器的工作时序
SPI Comms Digital Ouptu Pressure Sensors_TN_008202-3-EN_Final_30May12.pdf (210.39 KB, 下载次数: 1)

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

16

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2021-10-6
在线时间
4 小时
 楼主| 发表于 2021-10-8 09:57:10 | 显示全部楼层
回复

使用道具 举报

0

主题

16

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2021-10-6
在线时间
4 小时
 楼主| 发表于 2021-10-9 13:08:47 | 显示全部楼层
顶一下
回复

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2021-10-9 13:42:29 | 显示全部楼层
有用示波器抓下时序看下吗?先看看时序这些对不对,时序都不对的话通讯是连接不上的
回复

使用道具 举报

11

主题

2148

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4911
金钱
4911
注册时间
2015-1-10
在线时间
615 小时
发表于 2021-10-9 13:58:37 | 显示全部楼层
时序:第一个SCLK上升沿开始输出数据
回复

使用道具 举报

0

主题

16

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2021-10-6
在线时间
4 小时
 楼主| 发表于 2021-10-11 10:15:50 | 显示全部楼层
狼里个狼121 发表于 2021-10-9 13:42
有用示波器抓下时序看下吗?先看看时序这些对不对,时序都不对的话通讯是连接不上的

用了,不知道为什么没有时钟信号输出
回复

使用道具 举报

0

主题

16

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2021-10-6
在线时间
4 小时
 楼主| 发表于 2021-10-11 10:16:21 | 显示全部楼层
阿侑kevin 发表于 2021-10-9 13:58
时序:第一个SCLK上升沿开始输出数据

设置是上升沿读取啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 18:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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