mstar 平台I2C 配置
芯片的pin 腳可以用作不同的功能,總結一句就是外設進行狀態和數據交換。
// 如LED,屏的電源,背光的開關,功放的靜音等等。 除了控制設置之外,還需要和外部設置傳輸數據。
一般來說,大部分有特殊功能的Pin腳其實都可以作為GPIO使用,但是當我們將其配置成特殊功能后,就不能同時配為GPIO。
所以當我們發現某個Pin腳我們想將其配成GPIO后,卻沒辦法改變它的高低狀態時,就要留意一下該Pin腳是否已經被誤配為特殊功能了,這時就需要我們先DISABLE 掉這個特殊功能之后,才能設置成GPIO及其狀態設定。每個chip有對應一個init GPIO配置,BD_MST{$Board}.h, drvpadconf.c.
標準GPIO口配置
總共時鐘狀態
#define GPIO_NONE 0 // Not GPIO pin (default) #define GPIO_IN 1 // GPI #define GPIO_OUT_LOW 2 // GPO output low #define GPIO_OUT_HIGH 3 // GPO output high特殊口配置
特殊功能的pin 需要在BD_MST{$Board}.h 中配置。
#define DISABLE 0 #define ENABLE 1#define CONFIG_PADMUX_MODE0 0x00 #define CONFIG_PADMUX_MODE1 0x01 #define CONFIG_PADMUX_MODE2 0x02 #define CONFIG_PADMUX_MODE3 0x03 #define CONFIG_PADMUX_MODE4 0x04 #define CONFIG_PADMUX_MODE5 0x05 #define CONFIG_PADMUX_MODE6 0x06 #define CONFIG_PADMUX_MODE7 0x07 #define CONFIG_PADMUX_MODE8 0x08 #define CONFIG_PADMUX_MODE9 0x09 #define CONFIG_PADMUX_UNKNOWN 0xFF
例如UART3,UART4 配置成了CONFIG_PADMUX_MODE1,其實也是ENABLE。接著在drvPadConf.c 文件中設置寄存器值。
針對UART3,UART4 設置了寄存器0x1e05 的bit2,0x1e04的bit6 。這樣就配置完成了。
下面我們以I2C2 為例
I2C 的clk,data 腳分別連接在AD16,AC16 兩個pin 上面。比較特殊的是這兩個pin 都是有復用功能的。所以我們需要disable掉其特殊功能LED/tcon。在BD_MST160D_AH_M7221.h中我們可以關閉LED功能
Tcon[11],Tcon[12], 未找到,屬于備用的暫不處理
寄存器設置
#ifdef PADS_LED_MODE#if (PADS_LED_MODE != CONFIG_PADMUX_UNKNOWN)#define _CONFIG_LED_MODE ((PADS_LED_MODE == ENABLE) ? BIT4 : 0)_RVM1(0x1eb4, _CONFIG_LED_MODE, BIT4),#if (PADS_LED_MODE == DISABLE)_MEMMAP_PM_,//reg_seperate_wol_led_is_gpio_RVM1(0x0e39, BIT7, BIT7),//reg_led_is_gpio_RVM1(0x0e39, 0, BIT0),_MEMMAP_nonPM_,#endif#endif #endifdisable 掉特殊功能之后,開始配置I2C 功能
//SWI2C #define PAD_DDCR_CK_IS_GPIO GPIO_IN //I2C-SCL (EEPROM) #define PAD_DDCR_DA_IS_GPIO GPIO_IN //I2CM-SDA (EEPROM)#define PAD_TGPIO0_IS_GPIO GPIO_IN //TUNER_SCL #define PAD_TGPIO1_IS_GPIO GPIO_IN //TUNER_SDA*#define PAD_GPIO19_IS_GPIO GPIO_IN //I2C2-SCL #define PAD_GPIO20_IS_GPIO GPIO_IN //I2C2-SDA*將GPIO19,GPIO20 配置成了GPIO_IN,接著進行寄存器配置。如下:
#if(PAD_GPIO19_IS_GPIO != GPIO_NONE)#define PAD_GPIO19_OEN (PAD_GPIO19_IS_GPIO == GPIO_IN ? BIT1: 0)#define PAD_GPIO19_OUT (PAD_GPIO19_IS_GPIO == GPIO_OUT_HIGH ? BIT0: 0)_RVM1(0x2b08, PAD_GPIO19_OUT, BIT0),_RVM1(0x2b08, PAD_GPIO19_OEN, BIT1),//reg_tconconfig11_RVM1(0x1ea1, 0, BIT3), //reg[101ea1]#3 = 0b//reg_agc_dbg_RVM1(0x1e9e, 0, BIT7), //reg[101e9e]#7 = 0b//reg_led_mode_RVM1(0x1eb4, 0, BIT4), //reg[101eb4]#4 = 0b//reg_seconduartmode_RVM1(0x1e05, 0, BIT1 | BIT0), //reg[101e05]#1 ~ #0 = 00b//reg_od2nduart_RVM1(0x1ea9, 0, BIT1 | BIT0), //reg[101ea9]#1 ~ #0 = 00b//reg_miic_mode0_RVM1(0x1edc, 0, BIT0), //reg[101edc]#0 = 0b#endif#if(PAD_GPIO20_IS_GPIO != GPIO_NONE)#define PAD_GPIO20_OEN (PAD_GPIO20_IS_GPIO == GPIO_IN ? BIT1: 0)#define PAD_GPIO20_OUT (PAD_GPIO20_IS_GPIO == GPIO_OUT_HIGH ? BIT0: 0)_RVM1(0x2b09, PAD_GPIO20_OUT, BIT0),_RVM1(0x2b09, PAD_GPIO20_OEN, BIT1),//reg_tconconfig12_RVM1(0x1ea1, 0, BIT4), //reg[101ea1]#4 = 0b//reg_agc_dbg_RVM1(0x1e9e, 0, BIT7), //reg[101e9e]#7 = 0b//reg_led_mode_RVM1(0x1eb4, 0, BIT4), //reg[101eb4]#4 = 0b//reg_seconduartmode_RVM1(0x1e05, 0, BIT1 | BIT0), //reg[101e05]#1 ~ #0 = 00b//reg_od2nduart_RVM1(0x1ea9, 0, BIT1 | BIT0), //reg[101ea9]#1 ~ #0 = 00b//reg_vx1gpi_mode_RVM1(0x1e4a, 0, BIT1 | BIT0), //reg[101e4a]#1 ~ #0 = 00b//reg_miic_mode0_RVM1(0x1edc, 0, BIT0), //reg[101edc]#0 = 0b//reg_extint5_RVM1(0x1ea5, 0, BIT5), //reg[101ea5]#5 = 0b#endif其實配置成GPIO_IN 容易和 標準GPIO IN 模式產生誤解。應該區別一下定義成IIC_MODE等其他宏,然后drvpadconf.c 文件中,設置寄存器即可。寄存器值的設置才是pin 的功能設置的本質。這樣就完成mboot里面pin的功能定義。
使用的話,可以參考“Mstar平臺TCA9539 移植”
總結
以上是生活随笔為你收集整理的mstar 平台I2C 配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win软件使用---SecureCRT使
- 下一篇: 程序猿炫起富来你们根本看不懂!