OpenEdv-开源电子网

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

STM32采用SPI读取ADXL375数据发送给串口,读出数据全为0

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2020-10-7
在线时间
6 小时
发表于 2020-10-15 13:53:31 | 显示全部楼层 |阅读模式
11金钱
使用STM32F103C8T6的SPI2读取ADXL的器件ID和传感器数据并打印到串口,现在器件ID读取正确,但数据全为0,求助。

串口显示

串口显示




ADXL375代码如下:
  1. #include "adxl375.h"
  2. #include "delay.h"

  3. //SPI功能引脚初始化

  4. void adxl375_init(void)
  5. {
  6.         GPIO_InitTypeDef GPIO_InitStructure;
  7.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE );//PORTB时钟使能
  8.    //之所以打开其他gpio口是因为SPI2还挂载了其他硬件,所以要将其他的硬件屏蔽。
  9.       
  10.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;  // PB2 推挽
  11.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
  12.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.            GPIO_Init(GPIOB, &GPIO_InitStructure);
  14.           GPIO_SetBits(GPIOB,GPIO_Pin_2);//作为ADXL375的片选线

  15.         SPI2_Init();                           //初始化SPI
  16.         //SPI2_SetSpeed(SPI_BaudRatePrescaler_256);//256分频
  17.         SPI2_SetSpeed(SPI_BaudRatePrescaler_16);//16分频
  18. }


  19. //在给定地址上写一个字节的数 PB2
  20. void oneBytewrite(u8 add,u8 val)
  21. {   
  22.          GPIO_ResetBits(GPIOB,GPIO_Pin_2);
  23.          SPI2_ReadWriteByte(add|sw);
  24.          GPIO_SetBits(GPIOB,GPIO_Pin_2);
  25.          GPIO_ResetBits(GPIOB,GPIO_Pin_2);
  26.          SPI2_ReadWriteByte(val);
  27.    GPIO_SetBits(GPIOB,GPIO_Pin_2);
  28. }



  29. //从startaddress的地址开始写size长度的数据//PB2
  30. void multiByteWrite(int startAddress, float* buffer, int size)
  31. {
  32.     int tx = (startAddress|mw);
  33.     int i;
  34.     GPIO_ResetBits(GPIOB,GPIO_Pin_2);
  35.     //Send address to start reading from.
  36.     SPI2_ReadWriteByte(tx);
  37.     for ( i = 0; i < size; i++)
  38.                 {
  39.         buffer[i] = SPI2_ReadWriteByte(0x00);
  40.     }
  41.     GPIO_SetBits(GPIOB,GPIO_Pin_2);
  42. }



  43. //adxl375配置
  44. void adxl375_set()
  45. {
  46.    oneBytewrite(THRESH_SHOCK,0x03);//冲击阈值2.34g
  47.          oneBytewrite(BW_RATE,0x0d);//800hz 400bw
  48.          oneBytewrite(DATA_FORMAT,0x0f);//MSB  
  49. oneBytewrite(POWER_CTL,0x08);
  50.          oneBytewrite(OFSX,0x00);
  51.          oneBytewrite(OFSY,0x00);
  52.          oneBytewrite(OFSZ,0x00);
  53. }



  54. //一个字节的读取
  55. u8 oneByteRead(u8 address)
  56. {
  57.           u8 t;
  58.           GPIO_ResetBits(GPIOB,GPIO_Pin_2);
  59.     SPI2_ReadWriteByte(address|sr);
  60.                 t=SPI2_ReadWriteByte(0xff);
  61.          GPIO_SetBits(GPIOB,GPIO_Pin_2);
  62.          return t;
  63. }

  64.       
  65.         //从startadress读取size长度的数据
  66. void multiByteRead(int startAddress, float* buffer, int size)
  67. {
  68.     int tx = (startAddress|sr);
  69.                 int i;
  70.     GPIO_ResetBits(GPIOB,GPIO_Pin_2);
  71.     //Send address to start reading from.
  72.     SPI2_ReadWriteByte(tx);
  73.     for ( i= 0; i < size; i++)
  74.                 {
  75.         buffer[i] = SPI2_ReadWriteByte(0x00);
  76.     }
  77.     GPIO_SetBits(GPIOB,GPIO_Pin_2);
  78.         }

  79.       
  80.         //获取三轴数据
  81. void getOutput(float* readings)
  82. {
  83.     float buffer[6];
  84.     multiByteRead(DATAX0, buffer, 6);
  85.    
  86.     readings[0] = (int)buffer[1] << 8 | (int)buffer[0];
  87.     readings[1] = (int)buffer[3] << 8 | (int)buffer[2];
  88.     readings[2] = (int)buffer[5] << 8 | (int)buffer[4];
  89. }
复制代码


SPI代码如下:
  1. #include "spi.h"

  2. void SPI2_Init(void)
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         SPI_InitTypeDef  SPI_InitStructure;

  6.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE );//PORTB时钟使能 复用时钟使能
  7.         RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能         

  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出
  10.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB


  12.         

  13.          GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

  14.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
  15.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
  16.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
  17.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平
  18.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
  19.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
  20.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;                //定义波特率预分频的值:波特率预分频值为4
  21.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
  22.         SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
  23.         SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

  24.         SPI_Cmd(SPI2, ENABLE); //使能SPI外设
  25.         
  26.         SPI2_ReadWriteByte(0xff);//启动传输                 


  27. }
复制代码





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

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2023-11-30
在线时间
3 小时
发表于 2023-12-4 09:02:07 来自手机 | 显示全部楼层
请问这个问题解决了吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 16:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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