新闻详情

新闻详情

首页 / 资讯中心 / 详情

IC-MU128编码器使用教程

发布时间:2026/10/1 10:10:47来源:尧图网络
IC-MU128编码器使用教程
IC-MU128磁编码器芯片通信验证_ic-mu200-CSDN博客文章浏览阅读428次。该芯片是使用BISS或者SPI去通信的。由于我使用的是STM32作为MCU所以只能使用SPI去通信。从手册上面了解到的是该款芯片是只支持SPI0和SPI3模式。目前的话我使用的是软件SPI去验证通信的没有使用硬件SPI的原因很简单硬件工程师那边画错了。由于目前我还不是很熟悉这款芯片等后面供应商过来校准后开发更详细的资料后后续我还会再写一篇文档补充目前只是记录一下如何验证该款芯片的通信。目前和供应商那边沟通的情况是SPI通信波特率小于10Mbit即可具体多少手册上面也没有写。_ic-mu200https://blog.csdn.net/m0_74541086/article/details/159566708?spm1001.2014.3001.5501之前写的这篇文档只是简单验证一下IC-MUx的使用。并没有深入的去了解这款芯片说实战话供应商的技术支持是真的不行(简单吐槽一下)。搞的我这边不得不使用逻辑分析器去抓取上位机的数据进行验证。(1)激活操作功能在出始化的阶段需要通过ACTIVATE去激活芯片。通过发送0xB0、0x83去激活芯片芯片会返回0xB0、0x20进行应答。手册上面没有提到与ACTIVATE register相关的任何操作。所以具体应该写那边位去激活芯片也不明确。文档中提到如果不激活芯片的情况下去通讯Read REGISTER (single), Write REGISTER (single),SDAD statusandSDAD transmission都会导致REGISTER status/data里面的ERROR bit会报错。ACTIVATE激活之后0xAD里面的低四位会重新置位(清0)。(2)读取寄存器状态。每次进行SPI操作的时候都需要进行状态访问来查看上一次的访问是否失败通过OPCODE 0xAD。一般是0xAD、0x00、0x00。返回0xAD、0x01、0x0。其中0x1表示VALID 1表示上一次的数据是有效的。其中0x00的表示读取到的数据(读寄存器操作才会有效)。(3)写寄存器操作功能写寄存器的OPCODE是0xD2。指令OPCODE ADDR CODE。比如软件复位是0xD2、0x75、0x07就是对应写寄存器写地址0x75写命令是0x07是软复位操作。通过0xAD、0x00、0x00来判断写操作是否生效。比如返回了0xAD、0x01、0x0。(4)读寄存器操作功能读寄存器的OPCODE是0x97指令OPCODE ADDR比如0x970x74去获取编码器的型号然后通过0xAD、0x00、0x00来查看读操作是否生效和获取数据。返回数据是0xAD、0x01、0x15。下面的代码仅供参考uint8_t wdata[4] {0xA6,0xFF,0xFF,0xFF}; uint8_t rHdata[4] {0}; uint8_t rLdata[4] {0}; uint32_t EncoderFault; static void spi_xfer(SPI_HandleTypeDef *hspi, uint8_t *txbuf, uint8_t *rxbuf, uint16_t size, uint32_t wait_ms) { if(hspi-Instance SPI1) { SPI1_CS_L; HAL_SPI_TransmitReceive(hspi, txbuf, rxbuf, size, 2); SPI1_CS_H; } if(hspi-Instance SPI2) { SPI2_CS_L; HAL_SPI_TransmitReceive(hspi, txbuf, rxbuf, size, 2); SPI1_CS_H; } if(wait_ms) HAL_Delay(wait_ms); } static bool icmu_activate(SPI_HandleTypeDef *hspi) { bool ret false; uint8_t txbuf[2] {0xB0, 0x83}, rxbuf[2] {0}; for(uint8_t i 0; i 3 ; i) { spi_xfer(hspi, txbuf, rxbuf, 2, 1); if(rxbuf[1] 0x20) { ret true; break; } HAL_Delay(1); } return ret; } static bool icmu_read_reg(SPI_HandleTypeDef *hspi, uint8_t addr, uint8_t *rxbuf) { bool ret false; uint8_t txbuf1[2] {0x97, addr}, rxbuf1[2] {0}; uint8_t txbuf2[3] {0xAD, 0x00, 0x00}, rxbuf2[3] {0}; spi_xfer(hspi, txbuf1, rxbuf1, 2, 1); for(uint8_t i 0; i 3 ; i) { spi_xfer(hspi, txbuf2, rxbuf2, 3, 1); if(rxbuf2[1] 0x0C) return false; if(rxbuf2[1] 0x02) continue; if(rxbuf2[1] 0x01) { ret true; break; } } *rxbuf rxbuf2[2]; return ret; } static bool icmu_write_reg(SPI_HandleTypeDef *hspi, uint8_t addr,uint8_t data,uint8_t *rxbuf) { bool ret false; uint8_t txbuf1[3] {0xD2, addr,data}, rxbuf1[3] {0}; uint8_t txbuf2[3] {0xAD, 0x00, 0x00}, rxbuf2[3] {0}; spi_xfer(hspi, txbuf1, rxbuf1, 3, 1); for(uint8_t i 0; i 3 ; i) { spi_xfer(hspi, txbuf2, rxbuf2, 3, 1); if(rxbuf2[1] 0x0C) return false; if(rxbuf2[1] 0x02) continue; if(rxbuf2[1] 0x01) { ret true; break; } } *rxbuf rxbuf2[2]; return ret; } static bool soft_reset(SPI_HandleTypeDef *hspi) { bool ret false; uint8_t rxbuf; if(icmu_write_reg(hspi,0x75,0x07,rxbuf)) { if(rxbuf 0x07) { ret true; } } return ret; } static void Encoder1_Init(void) { uint8_t rxbuf; uint8_t i; for(i 0; i 3; i) { if(!icmu_activate(hspi1)) { EncoderFault | 0x00000080; return; } if(icmu_read_reg(hspi1,0x76,rxbuf)) { if(rxbuf ! 0x00) { if(rxbuf 0x10) EncoderFault | 0x00000001; if(rxbuf 0x0F) EncoderFault | 0x00000002; } rxbuf 0x00; } if(icmu_read_reg(hspi1,0x77,rxbuf)) { if(rxbuf ! 0x0) { if(rxbuf 0x37) EncoderFault | 0x00000004; if(rxbuf 0x08) EncoderFault | 0x00000008; if(rxbuf 0x40) EncoderFault | 0x00000010; if(rxbuf 0x80) EncoderFault | 0x00000020; } rxbuf 0x00; } if(EncoderFault 0x1) { if(soft_reset(hspi1)) EncoderFault 0; else EncoderFault | 0x00000040; } else if(EncoderFault 0x0) { break; } else { return; } } rxbuf 0; if(icmu_read_reg(hspi1,0x1E,rxbuf)) { if(rxbuf 0x1) { EncoderFault | 0x00000100; } } } static void Encoder2_Init(void) { uint8_t rxbuf; uint8_t i; for(i 0; i 3; i) { if(!icmu_activate(hspi2)) { EncoderFault | 0x00800000; return; } if(icmu_read_reg(hspi2,0x76,rxbuf)) { if(rxbuf ! 0x00) { if(rxbuf 0x10) EncoderFault | 0x00010000; if(rxbuf 0x0F) EncoderFault | 0x00020000; } rxbuf 0x00; } if(icmu_read_reg(hspi2,0x77,rxbuf)) { if(rxbuf ! 0x0) { if(rxbuf 0x37) EncoderFault | 0x00040000; if(rxbuf 0x08) EncoderFault | 0x00080000; if(rxbuf 0x40) EncoderFault | 0x00100000; if(rxbuf 0x80) EncoderFault | 0x00200000; } rxbuf 0x00; } if(EncoderFault 0x1) { if(soft_reset(hspi2)) EncoderFault 0; else EncoderFault | 0x00400000; } else if(EncoderFault 0x0) { break; } else { return; } } rxbuf 0; if(icmu_read_reg(hspi2,0x1E,rxbuf)) { if(!(rxbuf 0x1)) { EncoderFault | 0x01000000; } } } bool Encoder1_Homing(void) { bool ret false; uint8_t rxbuf; if(icmu_write_reg(hspi1,0x75,0x08,rxbuf)) { if(rxbuf 0x08) ret true; } return ret; } bool Encoder1_WriteEEPROM(void) { uint8_t rxbuf,txbuf[8]; if(!icmu_read_reg(hspi1,0x78,txbuf[0])) return false; if(!icmu_read_reg(hspi1,0x79,txbuf[1])) return false; if(!icmu_read_reg(hspi1,0x7A,txbuf[2])) return false; if(!icmu_read_reg(hspi1,0x7B,txbuf[3])) return false; if(!icmu_read_reg(hspi1,0x7C,txbuf[4])) return false; if(!icmu_read_reg(hspi1,0x7D,txbuf[5])) return false; if(!icmu_read_reg(hspi1,0x7E,txbuf[6])) return false; if(!icmu_read_reg(hspi1,0x7F,txbuf[7])) return false; icmu_write_reg(hspi1,0x42,0x00,rxbuf); icmu_write_reg(hspi1,0x43,0x00,rxbuf); icmu_write_reg(hspi1,0x78,txbuf[0],rxbuf); if(rxbuf ! txbuf[0]) return false; icmu_write_reg(hspi1,0x79,txbuf[1],rxbuf); if(rxbuf ! txbuf[1]) return false; icmu_write_reg(hspi1,0x7A,txbuf[2],rxbuf); if(rxbuf ! txbuf[2]) return false; icmu_write_reg(hspi1,0x7B,txbuf[3],rxbuf); if(rxbuf ! txbuf[3]) return false; icmu_write_reg(hspi1,0x7C,txbuf[4],rxbuf); if(rxbuf ! txbuf[4]) return false; icmu_write_reg(hspi1,0x7D,txbuf[5],rxbuf); if(rxbuf ! txbuf[5]) return false; icmu_write_reg(hspi1,0x7E,txbuf[6],rxbuf); if(rxbuf ! txbuf[6]) return false; icmu_write_reg(hspi1,0x7F,txbuf[7],rxbuf); if(rxbuf ! txbuf[7]) return false; icmu_write_reg(hspi1,0x75,0x01,rxbuf); if(rxbuf ! 0x01) return false; rxbuf 0x0; HAL_Delay(1000); if(icmu_read_reg(hspi1,0x76,rxbuf)) { if(rxbuf ! 0x00) { if(rxbuf 0x10) EncoderFault | 0x00000001; if(rxbuf 0x0F) EncoderFault | 0x00000002; } rxbuf 0x00; } HAL_Delay(10); if(icmu_read_reg(hspi1,0x77,rxbuf)) { if(rxbuf ! 0x0) { if(rxbuf 0x37) EncoderFault | 0x00000004; if(rxbuf 0x08) EncoderFault | 0x00000008; if(rxbuf 0x40) EncoderFault | 0x00000010; if(rxbuf 0x80) EncoderFault | 0x00000020; } rxbuf 0x00; } HAL_Delay(10); icmu_read_reg(hspi1,0x78,rxbuf); if(rxbuf txbuf[0]) return true; return false; } void Encoder_Init(void) { Encoder1_Init(); Encoder2_Init(); }
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

VC++抓包实战:WinPcap截取网卡数据包与协议解析 2026/10/1 11:34:26

VC++抓包实战:WinPcap截取网卡数据包与协议解析

简介:这是一份面向网络编程初学者与安全方向开发者的 VC 网络抓包程序源代码,基于 WinPcap 的 Packet32 驱动库实现网卡数据包嗅探与截取,可用于学习底层协议解析、网卡混杂模式设置及数据包过滤等核心技能。压缩包共 44 个文件,约…

阅读更多 →
无人机测试专题:从分系统到编队的重点项与关注点 2026/10/1 11:34:26

无人机测试专题:从分系统到编队的重点项与关注点

共 4 个测试专题,按系统划分测试重点项与主要关注项。 目录 1. 分系统测试关注点矩阵2. 飞行异常测试场景(8大类32项)3. 测试方法与工具4. 编队测试专项 1. 分系统测试关注点矩阵 机体平台与结构系统(结构与硬件 核心&#xf…

阅读更多 →
JSP超市管理系统实战:MyEclipse+MySQL经典组合开发指南 2026/10/1 11:34:26

JSP超市管理系统实战:MyEclipse+MySQL经典组合开发指南

简介:这是一套基于JSP与Java技术栈的超市管理系统源码,采用B/S架构,配合MyEclipse与Tomcat开发,适合正在学习Java Web、需要课程设计或毕业设计参考的初学者与在校学生。系统围绕超市日常业务展开,涵盖人事管理、销售管…

阅读更多 →
世界4大顶级黑客,排第一的他从不黑中国,最后一位是中国的骄傲 2026/10/1 11:34:26

世界4大顶级黑客,排第一的他从不黑中国,最后一位是中国的骄傲

世界4大顶级黑客,排第一的他从不黑中国,最后一位是中国的骄傲,大家对于黑客应该都是知道一点的,也都是特别的羡慕这种人的,全世界最顶级的黑客之一就是凯米,米特尼克了,他是第一个被美国的调查局…

阅读更多 →
Java SSM与Flask双框架房地产营销网站:前后台如何各司其职 2026/10/1 11:34:25

Java SSM与Flask双框架房地产营销网站:前后台如何各司其职

一个项目两面技术:Java SSM 与 Flask 如何在同一套房地产营销网站里各司其职作为一名折腾过不少毕业设计和企业级项目的开发者,当我第一次看到"基于 JavaSSMFlask 的房地产营销策划宣传网站"这个题目时,第一反应是:这不…

阅读更多 →
JavaMVC小区物业管理系统源码解析与二次开发实战 2026/10/1 11:34:18

JavaMVC小区物业管理系统源码解析与二次开发实战

简介:这份资源是面向计算机相关专业毕业设计场景的Java MVC实践项目——小区物业管理系统,适合正在准备毕设、需要完整可运行案例的本科或高职学生参考。项目采用MVC分层架构,数据库基于MySQL,前端使用BootStrap框架实现页面自适应…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉