STM8使用SPI通信需要注意的几个问题
概述:
在使用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通信需要注意的几个问题相关推荐
- STM32 SPI通信(读写flash)
SPI通信 四线制 MISO:主设备数据输入,从设备数据输出 MOSI:主设备数据输出,从设备数据输入 SCLK:时钟信号 CS:片选引脚(低电平有效) 时序图 读写程序 flash读写函数: u8 ...
- android spi串口调试,PIC入门3,SPI通信和串口调试实验
原标题:PIC入门3,SPI通信和串口调试实验 MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行. 程序: //适合3EPIC实验板,配置PIC的MSSP模块工作于SPI主控方式下, // ...
- TLE5012B ESP32驱动程序、硬件电路设计、4线SPI通信,驱动完美兼容4线SPI不用改MOSI开漏推挽输出
一.TLE5012B 简介 TLE5012B 是一种款高分辨率旋转位置传感器,用于在整个 360 度范围内进行角度测量. 它通过使用单片集成 巨磁阻 (iGMR) 元件,来测量正弦和余弦角分量,这些原 ...
- AS5047P磁编码器ESP32驱动程序、硬件电路设计、SPI通信时序、逻辑波形分析、注意事项
1.AS5047P硬件设计 1.1 简介.性能参数 AS5047P 是一种款高分辨率旋转位置传感器,用于在整个 360 度范围内进行高速(高达 28krpm)角度测量.这种新型位置传感器配备了革命性的 ...
- SPI通信实验---verilog(FPGA作为从机,使用可读可写)
文章原地址: http://www.cnblogs.com/fhyfhy/p/4429302.html SPI通信实验---verilog(FPGA作为从机,使用可读可写) 本实验讲究实用性,故设计思 ...
- stm32f405rgt6与as5048a的SPI通信问题
与as5048a的SPI通信问题 本人最近在学习无刷直流电机的FOC,其中用了一个带有磁编码器as5048a作为角度反馈的电机,其中pwm接口输出是正常的,但是在SPI通信的时候出现了问题.研究了几天 ...
- ADI官方解释在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/SDI)上的数据)
串行外设接口(SPI)是微控制器和外围IC(如传感器.ADC.DAC.移位寄存器.SRAM等)之间使用最广泛的接口之一.本文先简要说明SPI接口,然后介绍ADI公司支持SPI的模拟开关与多路转换器,以 ...
- CC3200 与 CC2530的SPI通信
目的:实现CC2530作为master,CC3200作为slave的SPI 通信 连接图如下 /*--------------------------– Master Slave ----- ---- ...
- stm8 硬件SPI
第一步:stm8 SPI简介 在配置SPI相关寄存器时要注意时钟信号的相位和极性. 这次我们使用的是stm8驱动SO-8封装的DAC8830,使其输出一个方波. DAC8830引脚说明和时序: CS是 ...
最新文章
- path classpath
- Sublime Text3 运行Python 出现Error:Decode error - output not utf-8
- anaconda不同虚拟环境下使用jupyter的问题
- MySQL创建函数,报错;SQL Error (1418)
- JZOJ 5483. 【清华集训2017模拟11.26】简单路径
- 董明珠炮轰国产车的创始人不开自己生产的车,事实果真如此吗?
- atmega8 例程:T1定时器 CTC模式 方波输出
- 【OpenCV 例程200篇】61. 导向滤波(Guided filter)
- wps怎么图片透明_Tips:设置图片透明背景
- How to shrink disk for KVM
- 版本管理工具git的使用总结
- linux cd 命令详解,Linux命令详解之–cd命令
- 测试低频噪音软件,低频噪音检测
- mysql环境变量配置还是不行_mysql环境变量配置与Error 1045的解决方案
- Flink典型应用场景
- cortex-m3/m4栈回溯
- SIM7600CE-CNSE 4G模块 树莓派/Windows连网指南
- 阿里云块存储团队卓越工程实践
- 双 JK 触发器 74LS112 逻辑功能。真值表_【第十章】触发器和事件
- 花卉识别python_基于深度学习的花卉识别系统设计与实现