對ch582M的I2C進行映射問題

把i2c的默認PB12,PB13映射到PB20,PB21,調(diào)用映射設(shè)置函數(shù),具體初始化,如下:

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 );


測試映射不成功,求幫助

看了設(shè)置驅(qū)動映射函數(shù)描述,沒有I2C的輸入描述,是否不支持此功能呀?驅(qū)動庫的函數(shù)如下:

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

* Function Name? : GPIOPinRemap

* Description? ? : 外設(shè)功能引腳映射

* 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

這里的模式設(shè)置為輸入上拉試試看。


非常感謝,測試完畢,i2c確實可以映射的;583的手冊里說I2C需要選擇正確時鐘:2-36M,實際主頻60M還是可以i2c的,不知道是手冊未修正,還是高頻時鐘i2c會存在穩(wěn)定性問題


CH582M的I2C調(diào)試分享,(費了一個禮拜時間排查):

現(xiàn)象:

①采用583的i2c實例對自己的CMOS攝像頭的I2C進行測試,發(fā)現(xiàn)不好用;示波器測試沒TCL和SDA信號輸出;

②通過串口監(jiān)視發(fā)現(xiàn):while( I2C_GetFlagStatus( I2C_FLAG_BUSY ) != RESET );?這個語句執(zhí)行不過去;

③通過讀i2c寄存器I2C_STAR2,并進行串口監(jiān)控,發(fā)現(xiàn)寄存器位--BUSY位一直為1,因此就出現(xiàn)上面那個語句無法執(zhí)行下去;


措施:

在初始化前,進行I2C軟復(fù)位,讓I2C設(shè)備釋放總線,使得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 );


建議:

雖然未找到原因(也許是設(shè)備上電未初始化前的引腳不確定性造成,),但建議i2c實例中增加軟復(fù)位,再初始化


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频