概述:

在使用STM8L101F3单片机,SPI通信读取三轴传感器ADXL362数据时,出现了一系列的问题,在这里做个笔记,也希望可以给大家一个小的参考。

问题一:

在SPI初始化过程中,没有初始化MISO,MOSI,SCLK三个引脚,导致在通信过程中写数据读数据出现问题。所以在这里贴出测试后可以正常运行的SPI初始化代码。(STM8L101F3,使用官方标准库)

#include "stm8l10x.h"
#include "stm8l10x_spi.h"
#include "stm8l10x_gpio.h"/***************************SPI相关定义**************************/
#define SPI_GPIO_PORT           GPIOB
#define SPI_CS_PIN              GPIO_Pin_4
#define SPI_SCLK_PIN            GPIO_Pin_5
#define SPI_MOSI_PIN            GPIO_Pin_6
#define SPI_MISO_PIN            GPIO_Pin_7/*以下设置为符合我三轴传感器对应配置*/
#define SPI_FIRSTBIT_TYPE       SPI_FirstBit_MSB
#define SPI_SPEED_PRESC         SPI_BaudRatePrescaler_4
#define SPI_MODE                SPI_Mode_Master
#define SPI_CPOL                SPI_CPOL_Low
#define SPI_CPHA                SPI_CPHA_1Edge
#define SPI_DATA_MODE           SPI_Direction_2Lines_FullDuplex
#define SPI_CS_CTRL             SPI_NSS_Soft/*SPI初始化*/
void spi_init(void)
{//开启SPI外设时钟CLK_PeripheralClockConfig(CLK_Peripheral_SPI, ENABLE);//SPI重置SPI_DeInit();//SPI相关GPIO初始化GPIO_Init(SPI_GPIO_PORT, SPI_CS_PIN, GPIO_Mode_Out_PP_High_Fast);GPIO_Init(SPI_GPIO_PORT, SPI_SCLK_PIN, GPIO_Mode_Out_PP_High_Fast);GPIO_Init(SPI_GPIO_PORT, SPI_MOSI_PIN, GPIO_Mode_Out_PP_High_Fast);//此设置很关键,作为主设备一定要将其设置为输入GPIO_Init(SPI_GPIO_PORT, SPI_MISO_PIN, GPIO_Mode_In_PU_No_IT);//SPI初始化SPI_Init(SPI_FIRSTBIT_TYPE, SPI_SPEED_PRESC, SPI_MODE, SPI_CPOL, SPI_CPHA,           SPI_DATA_MODE, SPI_CS_CTRL);//SPI启动SPI_Cmd(ENABLE);
}

问题二:

数据写入与数据读取问题,我在使用过程中,官方库提供了两个函数,一个是写入数据一个是接收数据。因为在我的应用中是需要先写两个字节命令及地址数据,然后再去读后面的数据。故在使用中即先使用SPI_SendData()函数写入数据就并未去读取对应的接收数据。(其实SPI通信读取数据,就是要先写入才能读取,只有写入从设备才有时钟。)然后开始读取数据,发现读取到的数据总是不对,后来通过仪器分析,发现回应的数据中有我需要的数据,但我读到的第一个数据其实是我写入时第一个字节回应的数据,也就是说在写入数据时,如果我们不把对应的数据读出,后面写入数据后再去读取数据,其实还是读取到的第一个字节写入时返回的数据,后面的数据并不会覆盖更新。这里贴一下,更改过后的代码。

/*此部分为写入读取数据部分代码,在读取写入数据前后要记得打开及关闭片选信号*/void spi_write(uint8_t data)
{while(SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);SPI_SendData(data);//一定不可省略不写,若不接收对应数据,马上去读数据就会造成读到的数据不对。while (SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET);u8 dd = SPI_ReceiveData();
}uint8_t spi_read()
{//选择一个无效数据发送(自定义,只是为了给从设备提供时钟),然后读取到对应数据uint8_t data = 0xff;while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);SPI_SendData(data);while (SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET);uint8_t rxdata  = SPI_ReceiveData();return rxdata;
}//写入数据并读取需要的数据
void spi_write2read(uint8_t *wdata, uint8_t wlen, uint8_t *rdata, uint8_t rlen)
{uint8_t i;if (wdata == NULL || rdata == NULL) {return;}//写数据for (i = 0; i < wlen; i++) {spi_write(wdata[i]);}//读数据for (i = 0; i < rlen; i++) {rdata[i] = spi_read();}
}

总结:

对于单片机上使用SPI又多了一点认识,哈哈。

STM8使用SPI通信需要注意的几个问题相关推荐

  1. STM32 SPI通信(读写flash)

    SPI通信 四线制 MISO:主设备数据输入,从设备数据输出 MOSI:主设备数据输出,从设备数据输入 SCLK:时钟信号 CS:片选引脚(低电平有效) 时序图 读写程序 flash读写函数: u8 ...

  2. android spi串口调试,PIC入门3,SPI通信和串口调试实验

    原标题:PIC入门3,SPI通信和串口调试实验 MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行. 程序: //适合3EPIC实验板,配置PIC的MSSP模块工作于SPI主控方式下, // ...

  3. TLE5012B ESP32驱动程序、硬件电路设计、4线SPI通信,驱动完美兼容4线SPI不用改MOSI开漏推挽输出

    一.TLE5012B 简介 TLE5012B 是一种款高分辨率旋转位置传感器,用于在整个 360 度范围内进行角度测量. 它通过使用单片集成 巨磁阻 (iGMR) 元件,来测量正弦和余弦角分量,这些原 ...

  4. AS5047P磁编码器ESP32驱动程序、硬件电路设计、SPI通信时序、逻辑波形分析、注意事项

    1.AS5047P硬件设计 1.1 简介.性能参数 AS5047P 是一种款高分辨率旋转位置传感器,用于在整个 360 度范围内进行高速(高达 28krpm)角度测量.这种新型位置传感器配备了革命性的 ...

  5. SPI通信实验---verilog(FPGA作为从机,使用可读可写)

    文章原地址: http://www.cnblogs.com/fhyfhy/p/4429302.html SPI通信实验---verilog(FPGA作为从机,使用可读可写) 本实验讲究实用性,故设计思 ...

  6. stm32f405rgt6与as5048a的SPI通信问题

    与as5048a的SPI通信问题 本人最近在学习无刷直流电机的FOC,其中用了一个带有磁编码器as5048a作为角度反馈的电机,其中pwm接口输出是正常的,但是在SPI通信的时候出现了问题.研究了几天 ...

  7. ADI官方解释在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/SDI)上的数据)

    串行外设接口(SPI)是微控制器和外围IC(如传感器.ADC.DAC.移位寄存器.SRAM等)之间使用最广泛的接口之一.本文先简要说明SPI接口,然后介绍ADI公司支持SPI的模拟开关与多路转换器,以 ...

  8. CC3200 与 CC2530的SPI通信

    目的:实现CC2530作为master,CC3200作为slave的SPI 通信 连接图如下 /*--------------------------– Master Slave ----- ---- ...

  9. stm8 硬件SPI

    第一步:stm8 SPI简介 在配置SPI相关寄存器时要注意时钟信号的相位和极性. 这次我们使用的是stm8驱动SO-8封装的DAC8830,使其输出一个方波. DAC8830引脚说明和时序: CS是 ...

最新文章

  1. path classpath
  2. Sublime Text3 运行Python 出现Error:Decode error - output not utf-8
  3. anaconda不同虚拟环境下使用jupyter的问题
  4. MySQL创建函数,报错;SQL Error (1418)
  5. JZOJ 5483. 【清华集训2017模拟11.26】简单路径
  6. 董明珠炮轰国产车的创始人不开自己生产的车,事实果真如此吗?
  7. atmega8 例程:T1定时器 CTC模式 方波输出
  8. 【OpenCV 例程200篇】61. 导向滤波(Guided filter)
  9. wps怎么图片透明_Tips:设置图片透明背景
  10. How to shrink disk for KVM
  11. 版本管理工具git的使用总结
  12. linux cd 命令详解,Linux命令详解之–cd命令
  13. 测试低频噪音软件,低频噪音检测
  14. mysql环境变量配置还是不行_mysql环境变量配置与Error 1045的解决方案
  15. Flink典型应用场景
  16. cortex-m3/m4栈回溯
  17. SIM7600CE-CNSE 4G模块 树莓派/Windows连网指南
  18. 阿里云块存储团队卓越工程实践
  19. 双 JK 触发器 74LS112 逻辑功能。真值表_【第十章】触发器和事件
  20. 花卉识别python_基于深度学习的花卉识别系统设计与实现

热门文章

  1. 电路布线问题(分支限界法)
  2. 公务员报考二级专业目录计算机类,浙江省考报名,所学专业所属的二级专业目录如何找?...
  3. 实证操作:R语言实现分位数回归的介绍
  4. SQL基础编程练习及答案
  5. 自动控制理论(7)——线性系统的稳态误差分析
  6. 数字电路模2运算原理,及模2的加减乘除详解
  7. 【图像处理:频率域平滑与锐化】理想滤波器,巴特沃思滤波器,高斯滤波器
  8. 《数学建模与数学实验》第5版 数据的统计描述 习题8.7
  9. 自动视觉锁螺丝机及其控制系统
  10. react-grid-layout 使用说明