MSTAR芯片的I2C 引脚配置

芯片的pin 脚可以用作不同的功能,总结一句就是外设进行状态和数据交换。

  1. 最常用的是作为GPIO,设置为输出模式时,通过高低电平来控制一些外围设置;
    // 如LED,屏的电源,背光的开关,功放的静音等等。 除了控制设置之外,还需要和外部设置传输数据。
  2. pin 作为GPIO 设置为IN时,是获取外设的高低来判断外设的状态,最常用的一些source 通道的detect,及一些wakeup 功能。
  3. pin 作为SAR 口,获取ADC值; // 如按键板,参照“mstar平台SAR口使用”
  4. pin 作为UART / SPI /SD 口;
  5. pin 作为I2C 口;

一般来说,大部分有特殊功能的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

  
  
  • 1
  • 2
  • 3
  • 4

特殊口配置

  1. uart 口配置

特殊功能的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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述
例如UART3,UART4 配置成了CONFIG_PADMUX_MODE1,其实也是ENABLE。接着在drvPadConf.c 文件中设置寄存器值。
在这里插入图片描述
针对UART3,UART4 设置了寄存器0x1e05 的bit2,0x1e04的bit6 。这样就配置完成了。

  1. I2C 总线功能配置

下面我们以I2C2 为例
在这里插入图片描述
I2C 的clk,data 脚分别连接在AD16,AC16 两个pin 上面。比较特殊的是这两个pin 都是有复用功能的。所以我们需要disable掉其特殊功能LED/tcon。在BD_MST160D_AH_M7221.h中我们可以关闭LED功能

#define PADS_LED_MODE                           DISABLE

 
 
  • 1

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

#endif

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

disable 掉特殊功能之后,开始配置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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

将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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

其实配置成GPIO_IN 容易和 标准GPIO IN 模式产生误解。应该区别一下定义成IIC_MODE等其他宏,然后drvpadconf.c 文件中,设置寄存器即可。寄存器值的设置才是pin 的功能设置的本质。这样就完成mboot里面pin的功能定义。

            </div>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值