对ch582M的I2C进行映射问题

把i2c的默认PB12,PB13映射到PB20,PB21,调用映射设置函数,具体初始化,如下:

GPIOPinRemap( ENABLE , RB_PIN_I2C );//映射到PB20/PB21

GPIOB_ModeCfg( GPIO_Pin_20 | GPIO_Pin_21, GPIO_ModeOut_PP_5mA); //GPIO_ModeIN_PU );主机

I2C_Init( I2C_Mode_I2C, 400000, I2C_DutyCycle_16_9, I2C_Ack_Enable, I2C_AckAddr_7bit, TxAddr );


测试映射不成功,求帮助

看了设置驱动映射函数描述,没有I2C的输入描述,是否不支持此功能呀?驱动库的函数如下:

/*******************************************************************************

* Function Name  : GPIOPinRemap

* Description    : 外设功能引脚映射

* Input          : s:  

ENABLE  - 引脚映射    

DISABLE - 默认引脚

   perph:

RB_PIN_SPI0  -  SPI0:  PA12/PA13/PA14/PA15 -> PB12/PB13/PB14/PB15

RB_PIN_UART1  -  UART1: PA8/PA9 ->  PB12/PB13

RB_PIN_UART0  -  UART0: PB4/PB7 ->  PA15/PA14

RB_PIN_TMR2  -  TMR2:  PA11 ->  PB11

RB_PIN_TMR1  -  TMR1:  PA10 ->  PB10

RB_PIN_TMR0  -  TMR0:  PA9 ->  PB23

* Return         : None

*******************************************************************************/

void GPIOPinRemap( FunctionalState s, UINT16 perph )

{

    if( s )     R16_PIN_ALTERNATE |= perph;

    else        R16_PIN_ALTERNATE &= ~perph;

}



IIC是可以映射的,上面的注释并没有写,这里可看到

1.png


1.png

这里的模式设置为输入上拉试试看。


非常感谢,测试完毕,i2c确实可以映射的;583的手册里说I2C需要选择正确时钟:2-36M,实际主频60M还是可以i2c的,不知道是手册未修正,还是高频时钟i2c会存在稳定性问题


CH582M的I2C调试分享,(费了一个礼拜时间排查):

现象:

①采用583的i2c实例对自己的CMOS摄像头的I2C进行测试,发现不好用;示波器测试没TCL和SDA信号输出;

②通过串口监视发现:while( I2C_GetFlagStatus( I2C_FLAG_BUSY ) != RESET ); 这个语句执行不过去;

③通过读i2c寄存器I2C_STAR2,并进行串口监控,发现寄存器位--BUSY位一直为1,因此就出现上面那个语句无法执行下去;


措施:

在初始化前,进行I2C软复位,让I2C设备释放总线,使得BUSY位为0;具体如下(红色部分):

  I2C_SoftwareResetCmd(ENABLE);

  I2C_SoftwareResetCmd(DISABLE);

  I2C_Init( I2C_Mode_I2C, 400000, I2C_DutyCycle_16_9, I2C_Ack_Enable, I2C_AckAddr_7bit, TxAdderss );


建议:

虽然未找到原因(也许是设备上电未初始化前的引脚不确定性造成,),但建议i2c实例中增加软复位,再初始化


只有登录才能回复,可以选择微信账号登录