硬件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 ...
随机推荐
- day03-Spring管理Bean-IOC-01
Spring管理Bean-IOC 1.Spring配置/管理bean介绍 Bean管理包括两方面: 创建bean对象 给bean注入属性 Bean的配置方式: 基于xml文件配置方式 基于注解配置方式 ...
- 基于 .NET7.0 开发Telegram 机器人(入门)
简介 Telegram(非正式简称TG.电报)是跨平台的即时通信软件,其客户端是自由及开放源代码软件,但服务端是专有软件.用户可以相互交换加密与自毁消息,发送照片.视频等所有类型文件.官方提供手机版( ...
- Flutter入门资料推荐
前言 群里很多入门小白不知道如何入门 Flutter,水一篇文章简单介绍下本人学习过程中一些参考资料,方便 Flutter 小白少走弯路. 非权威,推荐只针对本人经验来的说,大佬们不喜勿喷! 资料列表 ...
- Linux之ssh远程连接
Linux之ssh远程连接 一.下载远程连接工具Xshell Xshell是一种远程连接工具,可用来远程连接虚拟机. Xshell免费版下载地址 输入名字和邮箱,可以在邮箱看到下载Xshell的链接. ...
- spring boot swagger ui使用 nginx 部署后无法使用问题
location /saleapi/ { ## 指定HOST proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_ ...
- 安卓逆向 HOOK 第一课 XP的安装以及编写
<meta-data android:name="xposedmodule" android:value="true" /> <meta-da ...
- jenkins简单安装及配置(Windows环境
jenkins简单安装及配置(Windows环境) jenkins是一款跨平台的持续集成和持续交付.基于Java开发的开源软件,提供任务构建.持续集成监控的功能,可以使开发测试人员更方便的构建软件项目 ...
- 好用的liunx可视化管理工具
官网: https://www.terminal.icu/ 本地连接需要点击软件右上角切换线路到本地连接
- KMP字符串 AcWing 831
题目:https://www.acwing.com/problem/content/833/ 题意:求子串在母串中每次出现时的下标位置. 题解:哈哈哈,敲题时想到之前看到一个人叫 kmp 算法为 看毛 ...
- openfoam UPstream类探索(二)
前言 接上次的博文,本篇补全以下几个函数的介绍: Pstream::nProcs() Pstream::parRun() UPstream::exit() 简述几个常用的函数如下: Pstream:: ...