硬件IIC的重映射使用问题
沁恒的蓝牙系列芯片,有映射硬件模块去其他引脚的功能,可以配置各芯片的功能引脚重映射寄存器(R16_PIN_ALTERNATE),或者使用函数GPIOPinRemap函数进行配置。

比如说想要配置IIC重映射到PB20、21,可以调用如下代码↓
GPIOPinRemap(ENABLE, RB_PIN_UART2); //重映射串口2到PB22、23
GPIOB_SetBits(GPIO_Pin_23); //串口2GPIO初始化,TXD2_在配置推挽输出前先置位
GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeIN_PU);
GPIOB_ModeCfg(GPIO_Pin_23, GPIO_ModeOut_PP_5mA);
UART2_DefInit(); //串口2初始化
以下是常用重映射的一些注意点。
①实际使用哪个引脚就初始化哪个引脚。重映射之后只初始化默认引脚,再从重映射引脚接杜邦线那就调不通。
②重映射过去,使用的引脚可能有原本有特殊功能,比如说串口2的默认引脚在PA6、7,将它重映射到PB22、23时,注意PB23多用作手动复位脚,需要在ISP工具中取消“使能RST作为手工复位输入引脚”的框选,否则串口2发送数据拉低电平,就会复位芯片。PB22作为下载配置脚可以不用改,因为它只在上电的时候会用作boot脚,进了程序之后就参考普通串口配置GPIO即可。

硬件IIC的重映射,如果使用与默认引脚PB12、13一样的代码,会出问题↓
测试现象:重映射过后,用杜邦线将PB12、13接GND,上电复位/软件后,会卡在busy判忙。如果给原先的PB12、13上电初始化加上内部上拉,不会有卡在判忙的情况,即使是运行中拉低PB12、13也不会有影响。
其实手册中有作说明↓

大概意思是说,复位后会立即进行默认引脚PB12、13上的busy检测,即使没有使能硬件IIC,也会进行检测。由于复位时PB12、13引脚的电平状态是不确定的,若判断为busy,会导致接下来的IIC读写卡在判忙。
解决方法有两个,一个是在I2C_Init()函数中增加软件复位相关代码来清busy标志。注意PB20、21要配置为上拉(GPIO_ModeIN_PU)。最新EVT中已经在I2C_Init()函数中增加了复位相关代码。代码如下↓
GPIOB_ModeCfg(GPIO_Pin_20 | GPIO_Pin_21, GPIO_ModeIN_PU); //配置重映射之后的引脚 对应使用软件复位的方式
GPIOPinRemap(ENABLE, RB_PIN_I2C); //重映射到PB20、21
I2C_Init(I2C_Mode_I2C, 400000, I2C_DutyCycle_16_9, I2C_Ack_Enable, I2C_AckAddr_7bit, HOST_NO_ADDR);

另一个是在重映射之后,用四行代码拉GPIO模拟一个停止标志,清除一下busy的硬件标志位(这里用I2C_GenerateSTOP(ENABLE)由硬件产生一个停止信号测试不通,模拟一个停止位能调通)。原引脚对于busy的影响只在重映射函数之前。注意PB20、21要配置为推挽(GPIO_ModeOut_PP_5mA)。代码如下↓
GPIOB_ModeCfg(GPIO_Pin_20 | GPIO_Pin_21,GPIO_ModeOut_PP_5mA); GPIOPinRemap(ENABLE,RB_PIN_I2C); //重映射PB20、21 GPIOB_SetBits(GPIO_Pin_21); //给予一个停止标志,清BUSY
GPIOB_ResetBits(GPIO_Pin_20);
DelayMs(10);
GPIOB_SetBits(GPIO_Pin_20); I2C_Init(I2C_Mode_I2C, 400000, I2C_DutyCycle_16_9, I2C_Ack_Enable, I2C_AckAddr_7bit, HOST_NO_ADDR);
硬件IIC的重映射使用问题的更多相关文章
- usart2 重映射
今天拾起闲置很久的灰机,测试发现nrf2401坏掉,重新淘宝.还发现机上搭载的usart1坏掉,换成usart2,发现端口被电机占用,重映射到PD5,PD6 关键是后面两句不要忘记了 RCC_APB1 ...
- ARM地址重映射机制
转:http://blog.csdn.net/yuanzhangmei1/article/details/8395028 ARM体系结构中,系统上电或复位后,处理器将从地址0x0处取第一条指令,因此, ...
- STM32 部分重映射和完全重映射(查看数据手册)
数据手册如何查找对应的映射: 打开官网直接搜索STM32F可以看到数据手册,里面有关于重映射的表格,输入第6页的页码,点击9.3中的9.3x可打开对应的链接. 举例说明: STM32中拥有重映射功能 ...
- STM32重映射(PinRemap)的使用,注意!
STM32重映射,内容和细节稍后补充,这里只说几个注意点,花了我一晚上的时间调试终于找到问题所在了... 芯片: STM32f107vct6 晶振: 25M 通过分频器与锁相环,使系统时钟为72M 背 ...
- STM32F0系列MCU中断向量表的重映射
最近使用了一款Cortex-M0内核的芯片STM32F030CC,发现它中断向量表的重映射方法与STM32F10x系列的有所区别,在这里记录与分享一下. 由于需要通过IAP进行固件升级,所以芯片的FL ...
- STM32管教复用与重映射关系
摘自:http://blog.csdn.net/lincheng15/article/details/51789093 概括一下:复用就是一个引脚有几个功能,1.做普通IO输入输出 2.其他外设的输入 ...
- STM32 UART 重映射
在进行原理图设计的时候发现管脚的分配之间有冲突,需要对管脚进行重映射,在手册中了解到STM32 上有很多I/O口,也有很多的内置外设像:I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内 ...
- STM32 TIM重映射
复用功能 没有重映射 部分重映射 完全重映射 TIM3_CH1 PA6 PB4 PC6 CH2 PA7 PB5 PC7 CH3 PB0 PB0 PC8 CH4 PB1 PB1 PC9 /**重映射 t ...
- STM32硬件IIC操作
Stm32具有IIC接口,接口有以下主要特性 多主机功能:该模块既可做主设备也可做从设备 主设备功能 C地址检测 位/10位地址和广播呼叫 支持不同的通讯速度 状态标志: 发送器/接收器模式标志 字节 ...
- OpenCV探索之路(八):重映射与仿射变换
重映射 重映射就是把一幅图像中某个位置的像素放置到另一个图片中指定位置的过程. 用一个数学公式来表示就是: 其中的 f 就是映射方式,也就说,像素点在另一个图像中的位置是由 f 来计算的. 在Open ...
随机推荐
- Lock锁-线程状态概述
Lock锁 java.util.concurrent.locks.Lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作,同步代码块/同步方法具有的功能Loc ...
- 我们从 CircleCI 安全事件获得的3个经验教训
CircleCI 作为业内最受欢迎的 CI/CD 平台提供商之一,有超过20万个 DevOps 团队使用其平台.该公司在今年1月在其官网报告了一起安全事件引起客户恐慌.在此事件中,有身份不明的恶意攻击 ...
- 一把梭:REST API 全用 POST(转载)
一把梭:REST API 全用 POST(转载) 原文链接: https://coolshell.cn/articles/22173.html 写这篇文章的原因主要还是因为V2EX上的这个贴子,这个贴 ...
- statefulset详解及为何结合headless service部署有状态应用
1.1 有状态应用管理statefulset StatefulSet(有状态集,缩写为sts)常用于部署有状态的且需要有序启动的应用程序,比如在进行SpringCloud项目容器化时,Eureka的部 ...
- 用ChatGPT来了解ChatGPT
用ChatGPT来了解ChatGPT 之前学习一个新技术, 想着要搞清楚这6个问题(来自陈皓介绍的学习方法): 1.这个技术出现的背景, 初衷, 要达到什么样的目标或是要解决什么样的问题. 2.这个技 ...
- .NET 和 .NET Core 使用 JWT 授权验证
JWT介绍 参考文章 https://www.cnblogs.com/cjsblog/p/9277677.html 一..NET 中使用 1. NuGet包 搜索JWT,下载安装(本人用的是8.2.3 ...
- C++练习4 引用的定义与使用
使用 & 为变量和常量作为引用 1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int oneInt ...
- 在windows环境中如何批量添加IP地址 and 求助 : 在CMD命令行中配置IP地址, 提示 : 未能配置DHCP服务, 接口可能已经断开, 系统找不到指定的文件.
转载csdn: 在windows环境中如何批量添加IP地址_user_yuewu的博客-CSDN博客_windows批量添加ip 求助 : 在CMD命令行中配置IP地址, 提示 : 未能配置DHCP服 ...
- 嵌入式Linux—输入子系统
输入系统 常见的输入设备有键盘.鼠标.遥控杆.书写板.触摸屏等等,用户通过这些输入设备与Linux系统进行数据交换. 内核中怎样表示一个输入设备 // include/linux/input.h st ...
- 基于C++的OpenGL 13 之Mesh
1. 引言 本文基于C++语言,描述OpenGL的Mesh 前置知识可参考: 基于C++的OpenGL 12 之多光源 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者这里不过多 ...