2159|7

1582

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

【HC32F4A0开发板测评】+基于I2C的LED控制 [复制链接]

 

在HC32F4A0开发板上有3个LED灯是无法直接通过GPIO口来控制的,因为它们被接到了芯片TCA9539之下,见图1所示。

而该芯片是一款以I2C方式工作的芯片,它可控制扩展出的8个I/O口,3个LED灯就连接在它的I/O口上。

图1  TCA9539电路

 

 

图2  LED电路

 

此外,该芯片又是通过I2C接口来共享该总线的,它配分配的地址为1110100,并由如下语句来定义:

#define BSP_TCA9539_DEV_ADDR            (0x74U)

图3  I2C接口电路

 

在该I2C接口上,除连接TCA9539来进行I/O扩展外,还连接着AUDIO音频电路、EEPROM存储器、CAMERA摄像头电路等,并分配了相应的地址以便区分和控制。

图4  EEPROM电路

 

TCA9539芯片与HC32F4A0的连接关系为:

SCL---PD3

SDA---PF10

RST---PC13

INT---PI1

 

为此,对所用引脚的语句定义为:

#define EIO_RST_PORT                                (GPIO_PORT_C)

#define EIO_RST_PIN                                    (GPIO_PIN_13)

#define BSP_TCA9539_I2C_SCL_PORT       (GPIO_PORT_D)

#define BSP_TCA9539_I2C_SCL_PIN          (GPIO_PIN_03)

#define BSP_TCA9539_I2C_SDA_PORT       (GPIO_PORT_F)

#define BSP_TCA9539_I2C_SDA_PIN          (GPIO_PIN_10)

#define BSP_TCA9539_I2C_SCL_FUNC       (GPIO_FUNC_49)

#define BSP_TCA9539_I2C_SDA_FUNC       (GPIO_FUNC_48)

 

相应的其初始化函数为:

  • static void BSP_TCA9539_I2C_Init(void)
  • {
  • stc_gpio_init_t stcGpioInit;
  • /* Configuration I2C GPIO */
  • (void)GPIO_StructInit(&stcGpioInit);
  • (void)GPIO_Init(BSP_TCA9539_I2C_SCL_PORT, BSP_TCA9539_I2C_SCL_PIN, &stcGpioInit);
  • (void)GPIO_Init(BSP_TCA9539_I2C_SDA_PORT, BSP_TCA9539_I2C_SDA_PIN, &stcGpioInit);
  • GPIO_SetFunc(BSP_TCA9539_I2C_SCL_PORT, BSP_TCA9539_I2C_SCL_PIN, BSP_TCA9539_I2C_SCL_FUNC);
  • GPIO_SetFunc(BSP_TCA9539_I2C_SDA_PORT, BSP_TCA9539_I2C_SDA_PIN, BSP_TCA9539_I2C_SDA_FUNC);
  • /* Enable I2C Peripheral*/
  • FCG_Fcg1PeriphClockCmd(BSP_TCA9539_I2C_FCG, ENABLE);
  • (void)BSP_I2C_Init(BSP_TCA9539_I2C_UNIT);
  • }

 

TCA9539对输出引脚进行写操作的函数为:

  • int32_t TCA9539_WritePin(const stc_tca9539_ll_t *pstcTca9539LL, uint8_t u8Port, uint8_t u8Pin, uint8_t u8PinState)
  • {
  • int32_t i32Ret = LL_OK;
  • uint8_t u8TempData[2];
  • if (pstcTca9539LL == NULL) {
  • i32Ret = LL_ERR_INVD_PARAM;
  • } else {
  • u8TempData[0] = u8Port + TCA9539_REG_OUTPUT_PORT0;
  • pstcTca9539LL->Read(&u8TempData[0], &u8TempData[1], 1U);
  • if (0U == u8PinState) {
  • u8TempData[1] &= (uint8_t)(~u8Pin);
  • } else {
  • u8TempData[1] |= u8Pin;
  • }
  • pstcTca9539LL->Write(&u8TempData[0], &u8TempData[1], 1U);
  • }
  • return i32Ret;
  • }

 

那TCA9539又是如何来控制扩展I/O口的呢?

它是通过先定义各I/O口的作用,然后再进行使用的,它对各I/O口的定义如下:

#define EIO_USBFS_OC                    (TCA9539_IO_PIN0)   /* USBFS over-current, input */

#define EIO_USBHS_OC                    (TCA9539_IO_PIN1)   /* USBHS over-current, input */

#define EIO_SDIC1_CD                    (TCA9539_IO_PIN2)   /* SDIC1 card detect, input */

#define EIO_SCI_CD                      (TCA9539_IO_PIN3)   /* Smart card detect, input */

#define EIO_TOUCH_INT                   (TCA9539_IO_PIN4)   /* Touch screen interrupt, input */

#define EIO_LIN_SLEEP                   (TCA9539_IO_PIN5)   /* LIN PHY sleep, output */

#define EIO_RTCS_CTRST                  (TCA9539_IO_PIN6) 

/* 'CS' for Resistor touch panel or 'Reset' for Cap touch panel, output */

#define EIO_LCD_RST                     (TCA9539_IO_PIN7)   /* LCD panel reset, output */

 

#define EIO_CAM_RST                     (TCA9539_IO_PIN0)   /* Camera module reset, output */

#define EIO_CAM_STB                     (TCA9539_IO_PIN1)   /* Camera module standby, output */

#define EIO_USB3300_RST                 (TCA9539_IO_PIN2)   /* USBHS PHY USB3300 reset, output */

#define EIO_ETH_RST                     (TCA9539_IO_PIN3)   /* ETH PHY reset, output */

#define EIO_CAN_STB                     (TCA9539_IO_PIN4)   /* CAN PHY standby, output */

#define EIO_LED_RED                     (TCA9539_IO_PIN5)   /* Red LED, output */

#define EIO_LED_YELLOW                  (TCA9539_IO_PIN6)   /* Yellow LED, output */

#define EIO_LED_BLUE                    (TCA9539_IO_PIN7)   /* Blue LED, output */

 

这其中的EIO_LED_RED、EIO_LED_YELLOW及EIO_LED_BLUE就是那3个不能直接进行控制的LED。

 

而这些I/O口,又具体对应着控制字的某一位,这由下面的定义可以看出:

#define TCA9539_IO_PIN0                 (0x01U)

#define TCA9539_IO_PIN1                 (0x02U)

#define TCA9539_IO_PIN2                 (0x04U)

#define TCA9539_IO_PIN3                 (0x08U)

#define TCA9539_IO_PIN4                 (0x10U)

#define TCA9539_IO_PIN5                 (0x20U)

#define TCA9539_IO_PIN6                 (0x40U)

#define TCA9539_IO_PIN7                 (0x80U)

#define TCA9539_IO_PIN_ALL              (0xFFU)

 

在建立了以上控制关系后,就可以对相应的I/O口进行功能配置了,所用的初始化函数为:

  • void BSP_IO_Init(void)
  • {
  • /* Configuration the low layer of TCA9539 */
  • stcTca9539Config.Init = BSP_TCA9539_I2C_Init;
  • stcTca9539Config.Write = BSP_TCA9539_I2C_Write;
  • stcTca9539Config.Read = BSP_TCA9539_I2C_Read;
  • stcTca9539Config.Reset = BSP_TCA9539_Reset;
  • stcTca9539Config.IntInit = NULL;
  • /* Configuration the TCA9539 */
  • (void)TCA9539_Init(&stcTca9539Config);
  • }

 

以TCA9539实现位写入操作的函数为:

void BSP_IO_WritePortPin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8PinState)

{

    (void)TCA9539_WritePin(&stcTca9539Config, u8Port, u8Pin, u8PinState);

}

以TCA9539实现位异或操作的函数为:

void BSP_IO_TogglePortPin(uint8_t u8Port, uint8_t u8Pin)

{

    (void)TCA9539_TogglePin(&stcTca9539Config, u8Port, u8Pin);

}

 

通过上面这2个函数,就为后续的LED控制提供了基础性的支持。

 

为控制这3个LED灯,所做的端口和引脚定义为:

#define EIO_LED_RED                     (TCA9539_IO_PIN5)   /* Red LED, output */

#define EIO_LED_YELLOW                  (TCA9539_IO_PIN6)   /* Yellow LED, output */

#define EIO_LED_BLUE                    (TCA9539_IO_PIN7)   /* Blue LED, output */

 

#define LED_PORT                        (EIO_PORT1)

#define LED_RED_PORT                    (EIO_PORT1)

#define LED_RED_PIN                     (EIO_LED_RED)

#define LED_YELLOW_PORT                 (EIO_PORT1)

#define LED_YELLOW_PIN                  (EIO_LED_YELLOW)

#define LED_BLUE_PORT                   (EIO_PORT1)

#define LED_BLUE_PIN                    (EIO_LED_BLUE)

 

在该定义的情况下,实现LED灯初始化的函数为:

  • void BSP_LED_Init(void)
  • {
  • /* Turn off LED before output */
  • BSP_IO_WritePortPin(LED_PORT, (LED_RED_PIN | LED_YELLOW_PIN | LED_BLUE_PIN), LED_OFF);
  • /* LED pins set to output */
  • BSP_IO_ConfigPortPin(LED_PORT, (LED_RED_PIN | LED_YELLOW_PIN | LED_BLUE_PIN), EIO_DIR_OUT);
  • }

 

其中的EIO_DIR_OUT是指定所用的I/O口做输出口使用,LED_OFF则指定对应的I/O口输出低电平。

 

具体的LED控制可通过下面3个函数的调用来实现,其内容如下:

  • void BSP_LED_On(uint8_t u8Led)
  • {
  • BSP_IO_WritePortPin(LED_PORT, u8Led, LED_ON);
  • }
  • void BSP_LED_Off(uint8_t u8Led)
  • {
  • BSP_IO_WritePortPin(LED_PORT, u8Led, LED_OFF);
  • }
  • void BSP_LED_Toggle(uint8_t u8Led)
  • {
  • BSP_IO_TogglePortPin(LED_PORT, u8Led);
  • }

 

由此可见使用I2C接口的芯片进行I/O口扩展还是有代价的,会在一定程度上增加使用的复杂度。

查看本帖全部内容,请登录或者注册

最新回复

是的,一般开发板我觉得用IO扩展的少,产品上倒是用的不少。   详情 回复 发表于 2023-2-28 09:10
点赞 关注(1)
 
 

回复
举报

7188

帖子

11

TA的资源

版主

沙发
 

感谢老师这详细的讲解,学习了。

点评

把了解到的分享一下,免去过多的时间消耗。  详情 回复 发表于 2023-2-26 09:55
 
 
 

回复

1582

帖子

1

TA的资源

五彩晶圆(初级)

板凳
 
lugl4313820 发表于 2023-2-25 19:58 感谢老师这详细的讲解,学习了。

把了解到的分享一下,免去过多的时间消耗。

 
 
 

回复

6860

帖子

9

TA的资源

版主

4
 

这是硬件模拟?      

点评

基于硬件的  详情 回复 发表于 2023-2-26 09:57
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

1582

帖子

1

TA的资源

五彩晶圆(初级)

5
 
秦天qintian0303 发表于 2023-2-26 09:55 这是硬件模拟?      

基于硬件的

 
 
 

回复

7500

帖子

2

TA的资源

版主

6
 

这种板子点灯就挺麻烦的,还得通过另一个芯片去点亮LED灯。

点评

的确,好在是用在I/O扩展时,不到不得已不用。  详情 回复 发表于 2023-2-27 23:46
 
 
 

回复

1582

帖子

1

TA的资源

五彩晶圆(初级)

7
 
wangerxian 发表于 2023-2-27 13:11 这种板子点灯就挺麻烦的,还得通过另一个芯片去点亮LED灯。

的确,好在是用在I/O扩展时,不到不得已不用。

点评

是的,一般开发板我觉得用IO扩展的少,产品上倒是用的不少。  详情 回复 发表于 2023-2-28 09:10
 
 
 

回复

7500

帖子

2

TA的资源

版主

8
 
jinglixixi 发表于 2023-2-27 23:46 的确,好在是用在I/O扩展时,不到不得已不用。

是的,一般开发板我觉得用IO扩展的少,产品上倒是用的不少。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播报名| TI 面向楼宇和工厂自动化行业的毫米波雷达解决方案
【内容简介】TI 60GHz IWRL6432和 IWRL1432毫米波雷达传感器如何帮助解决楼宇和工厂自动化应用中的感应难题
【直播时间】5月28日(周三)上午10:00
【直播礼品】小米双肩包、contigo水杯、胶囊伞、安克充电器

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 7

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表