SPI读取TLE5012B编码器角度数据_ACM32G103

买到一个带编码器的电机,卖家留出来读取编码器数据的接口有SPI
具体的原理图如下:
在这里插入图片描述
P2标注的是SPI的接口,其中MISO和MOSI是硬件连接到一起的
使用ACM32G103的硬件SPI2去读取其角度数据
原理大概如下:
1、先发送读取数据的指令,然后再接收数据,一个半双工通信的过程
2、因为MOSI和MISO硬件上连接到了一起,根据TLE5102B的通信时序要求就要稍微修改一下MOSI引脚的状态,片选使用软件片选
3、SPI2的配置CPOL=0,CPHA=1
4、SPI2引脚:
PB9 CS AF3
PB8 SCK AF3
PB7 MOSI AF3
PB6 MISO AF3
其中CS的初始化要修改一下,要初始化为GPIO
接下来直接看代码

#define SPI_USE SPI2
void SPI_USE_Transfer_OneByte(uint8_t *sdata,uint16_t ssize)
{/* Clear Batch Done Flag  */SET_BIT(SPI_USE->STATUS, SPI_STATUS_TX_BATCH_DONE);SET_BIT(SPI_USE->STATUS, SPI_STATUS_BATCH_DONE);/* Clear TX FIFO */SET_BIT(SPI_USE->TX_CTL, SPI_TX_CTL_FIFO_RESET);CLEAR_BIT(SPI_USE->TX_CTL, SPI_TX_CTL_FIFO_RESET);/* Set Data Size */SPI_USE->BATCH = ssize;/* Tx Enable */SPI_USE->TX_CTL |= SPI_TX_CTL_EN;/* Transmit Start */SPI_USE->CS |= SPI_CS_CS0;while(ssize > 0){while (SPI_USE->STATUS & SPI_STATUS_TX_FIFO_FULL){}SPI_USE->DAT = *sdata;sdata++;ssize--;}while (!(SPI_USE->STATUS & SPI_STATUS_TX_BATCH_DONE)){}/* Clear Batch Done Flag  */SET_BIT(SPI_USE->STATUS, SPI_STATUS_TX_BATCH_DONE);SET_BIT(SPI_USE->STATUS, SPI_STATUS_BATCH_DONE);/* Tx Disable */SPI_USE->TX_CTL &= (~SPI_TX_CTL_EN);SPI_USE->CS &= (~SPI_CS_CS0);
}void SPI_USE_Receive_OneByte(uint8_t *rdata,uint16_t rsize)
{/* Clear Batch Done Flag  */SET_BIT(SPI_USE->STATUS, SPI_STATUS_RX_BATCH_DONE);SET_BIT(SPI_USE->STATUS, SPI_STATUS_BATCH_DONE);/* Set Data Size */SPI_USE->BATCH = rsize;/* Rx Enable */SPI_USE->RX_CTL |= SPI_RX_CTL_EN;/* Receive Start */SPI_USE->CS |= SPI_CS_CS0;while(rsize > 0){/* Wait Rx FIFO Not Empty */while (SPI_USE->STATUS & SPI_STATUS_RX_FIFO_EMPTY){}*rdata = 	SPI_USE->DAT;rsize--;rdata++;}/* Wait Transmit Done */while (!(SPI_USE->STATUS & SPI_STATUS_RX_BATCH_DONE));/* Clear Batch Done Flag  */SET_BIT(SPI_USE->STATUS, SPI_STATUS_RX_BATCH_DONE);SET_BIT(SPI_USE->STATUS, SPI_STATUS_BATCH_DONE);/* Rx Disable */SPI_USE->RX_CTL &= (~SPI_RX_CTL_EN);/* Receive End */SPI_USE->CS &= (~SPI_CS_CS0);
}

再来看读取角度的过程

//        TxBuffer[0] = 0x80;
//	      TxBuffer[1] = 0x21;		
GPIOB->BSC = GPIO_PIN_9 << 16U;
PB7_OUTPUT();			
SPI_USE_Transfer_OneByte(TxBuffer,2);					
PB7_INPUT();
SPI_USE_Receive_OneByte(RxBuffer,2);				
GPIOB->BSC = GPIO_PIN_9;
Angle= (RxBuffer[0]<<8 | RxBuffer[1])&0x7FFF;		

每次发送完读取数据的指令之后,因为MOSI和MISO硬件连接到一起,我们就要将MOSI引脚由复用为SPI设置为输入状态,下一次发指令的时候重新复用为SPI
其中将MOSI引脚设置成输入和复用的代码如下

void PB7_INPUT(void)
{GPIOB->MD  &= ~(3<<14);
}void PB7_OUTPUT(void)
{GPIOB->AF0 |= GPIO_FUNCTION_3 << 28;GPIOB->DS0 |= GPIO_DRIVE_LEVEL3 <<28;GPIOB->OTYP &= (~GPIO_PIN_7);GPIOB->PUPD |= GPIO_PULLUP<<14;GPIOB->MD |= GPIO_MODE_AF_PP<<14;
}

读取速度,TLE5012B推荐的SPI速率最大是8M,可以根据实际情况提高,也能读到数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/527037.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java二叉树 (2)

&#x1f435;本篇文章将对二叉树的一些基础操作进行梳理和讲解 一、操作简述 int size(Node root); // 获取树中节点的个数int getLeafNodeCount(Node root); // 获取叶子节点的个数int getKLevelNodeCount(Node root,int k); // 获取第K层节点的个数int getHeight(Node r…

浅谈2024 年 AI 辅助研发趋势!

目录 ​编辑 引言 一、AI辅助研发现状 1. 技术发展 2. 工具集成 3. 应用场景 二、AI辅助研发趋势 1. 更高的自动化程度 2. 更高的智能化程度 3. 更多的领域应用 4. 更高的重视度 三、结论 四. 完结散花 悟已往之不谏&#xff0c;知来者犹可追 创作不易&#xff…

阿里云服务器多少钱一年?价格表新鲜出炉(2024)

2024阿里云服务器优惠活动政策整理&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;云服务器8核…

SpringCloudGateway理论与实践

文章目录 网关介绍为什么需要网关Gateway 使用gateway pom依赖yml 配置重启测试总结 断言过滤器工厂路由过滤器的种类请求头过滤器默认过滤器全局过滤器总结 Gateway解决跨域 网关介绍 Spring Cloud Gateway 是一个基于Spring Framework 5&#xff0c;由Spring Cloud团队开发的…

如何解决新版的anaconda notebook 打不开浏览器

1 安装nodejs 先安装nodejs&#xff0c;里面有很多需要用node来启动服务 2 一片空白 安装jupyter以后启动&#xff0c; 结果就得到了如下&#xff0c;在chrome里面打开以后&#xff0c;一片空白 3 列出环境 conda create --name pytorch python3.9 conda env list cond…

Kubernetes-4

文章目录 Kubernetes-41、pod的生命周期2、pod的中止过程3、强制终止pod4、查看资源类型4.1、kubectl get 后面接的都是资源类型4.2、kubectl api-resources 查看目前有哪些资源类型 5、容器的状态5.1、总结5.2、Pod 状态和 Pod 内部容器状态5.3、容器的重启策略 6、探针probe6…

C/C++指针详解

接下来我们来介绍一下什么是指针&#xff1f; 指针其实就是元素存放地址&#xff0c;更加形象的比喻&#xff1a;在酒店中如果你想要去注必须去付费不然不能住&#xff0c;在计算机也同样如此&#xff08;但是不需要付费哦&#xff09;每当我们使用一个变量或其他需要申请空间…

C/C++编程-理论学习-通信协议理论

通信协议理论 protobuf简述使用简介proto 文件为了nanopb 编译.proto文件修改生成器行为 streamsoutput streamsinput streams Data types(数据类型)Field callbacks(字段回调)Encoding callbacks(编码回调)Message descriptor(信息描述)三个关键字required、optional、repeate…

每日OJ题_路径dp②_力扣63. 不同路径 II

目录 力扣63. 不同路径 II 解析代码 力扣63. 不同路径 II 63. 不同路径 II 难度 中等 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;…

【蓝桥·算法双周赛】第七场分级赛——小白入门赛

2.霓虹【算法赛】 - 蓝桥云课 (lanqiao.cn) st数组用来存第i个位置&#xff0c;这个字母有没有编号j #include<bits/stdc.h> const int N1e610; using lllong long; std::map<std::string,std::string> mp;std::string a,aa; int st[N][10];// int stt[N][10];//对…

Vue+SpringBoot打造个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

Spring事件发布监听器ApplicationListener原理- 观察者模式

据说监听器模式也是mq实现的原理, 不过mq我还没来得及深入学习, 先用spring来理解一下吧 Spring事件发布监听器ApplicationListener原理- 观察者模式 什么是观察者模式一个Demo深入认识一下观察者模式Spring中的事件发布监听ps 什么是观察者模式 大家都听过一个故事叫做烽火戏…