[设计过程分享] MAX32630FTHR设计笔记(1):流水灯(GPIO输出配置)及I2C驱动MAX14690

Justice_Gao   2017-7-2 23:08 楼主
首先感谢EE,板子终于到了,看完资料后给大家提供一个GPIO口的输出配置及MAX14690电池管理芯片的驱动配置 /******************************************************************* 内容:GPIO口配置,输出,及I2C驱动MAX14690 作者:Justice_Gao 日期:2017年7月2日 开发工具:KEIL MDK 版本:V5.23 *******************************************************************/ (1)三色灯D1的GPIO口底层驱动 QQ截图20170702214802.png 如图所示,三色灯分别与MAX32630的P2_4、P2_5和P2_6连接,当P2_4=0、P2_5=1、P2_6=1时,亮红灯;当P2_4=1、P2_5=0、P2_6=1时,亮绿灯;当P2_4=1、P2_5=1、P2_6=0时,亮蓝灯; 则初始化GPIO的程序为
  1. const gpio_cfg_t LED[] = {
  2. { PORT_2, PIN_4, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
  3. { PORT_2, PIN_5, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
  4. { PORT_2, PIN_6, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
  5. };
  6. void GPIO_Initial()
  7. {
  8. GPIO_Config(&LED[0]);
  9. GPIO_Config(&LED[1]);
  10. GPIO_Config(&LED[2]);
  11. }
这里我延伸一下,配置GPIO的输出类型有两种方法。 (1)GPIO口的配置及应用 /****************************************************************** max32630的GPIO的初始化设置相比较STM32F4的GPIO口初始化设置更为简单 初始化方法有两种: (1)类似于STM32的方法:配置P3_0和P3_1管脚为输出管脚 gpio_cfg_t GPIO_OUTPUT_Pin;
  1. typedef struct {
  2. uint32_t port; /// Index of GPIO port
  3. uint32_t mask; /// Pin mask. Multiple bits can be set.
  4. gpio_func_t func; /// Function type
  5. gpio_pad_t pad; /// Pad type
  6. } gpio_cfg_t;
GPIO_OUTPUT_Pin.port = PORT_3; //设置端口P0~P4 GPIO_OUTPUT_Pin.mask = PIN_0|PIN_1; //设置pin位管脚,0~7 GPIO_OUTPUT_Pin.func = GPIO_FUNC_GPIO;//GPIO Function Selection GPIO_OUTPUT_Pin.pad = GPIO_PAD_OPEN_DRAIN;// 适合有外设上拉电阻的输出管脚 GPIO_Config(&GPIO_OUTPUT_Pin);//初始化 则控制输出高低电平可直接调用函数GPIO_OutSet和GPIO_OutClr, 如输出高电平,则GPIO_OutSet(&GPIO_OUTPUT_Pin); 输出低电平,GPIO_OutClr(&GPIO_OUTPUT_Pin); 缺点:这种方法不适用设置多个输出类型pin管脚,比如P3_1输出高电平,P3_0输出低电平,这种方法就不适合 /*=================================================================== (2)第二种方法,可以说比前一种方便快捷的多:设置4个输出控制引脚 const gpio_cfg_t GAN_COL_Pin[] = { { PORT_4, PIN_0, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN }, { PORT_4, PIN_1, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN }, { PORT_4, PIN_2, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN }, { PORT_4, PIN_3, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN }, }; 在使用这些GPIO口前,首先需要初始化, for(uint8_t i=0;i<4;i++) { GPIO_Config(&GAN_COL_Pin); } 然后直接调用输出,如 GPIO_OutSet(&GAN_COL_Pin[0]); //P4_0输出高电平 GPIO_OutSet(&GAN_COL_Pin[1]); //P4_1输出高电平 GPIO_OutClr(&GAN_COL_Pin[2]); //P4_2输出低电平 GPIO_OutClr(&GAN_COL_Pin[3]); //P4_3输出低电平 ======================================================================*/ 言归正传,下面我们来介绍I2C驱动MAX14690部分 (2)I2C驱动MAX14690 如果主函数对MAX14690没有初始化,则LDO2和LDO3不会输出电压3V3和L3OUT。代码如下:
  1. int MAX14690_Init(const max14690_cfg_t *max14690cfg)
  2. {
  3. uint8_t addr;
  4. uint8_t data[2];
  5. /* Setup the I2CM Peripheral to talk to the MAX14690 */
  6. I2CM_Init(MAX14690_I2CM, &max14690_sys_cfg, I2CM_SPEED_100KHZ);
  7. /* Attempt to read the ID from the device */
  8. addr = MAX14690_REG_CHIP_ID;
  9. if (I2CM_Read(MAX14690_I2CM, MAX14690_I2C_ADDR, &addr, 1, data, 2) != 2) {
  10. return E_COMM_ERR;
  11. }
  12. /* Configure the initial state of LDO2 */
  13. if (MAX14690_LDO2SetV(max14690cfg->ldo2mv) != E_NO_ERROR) {
  14. return E_COMM_ERR;
  15. }
  16. if (MAX14690_LDO2SetMode(max14690cfg->ldo2mode) != E_NO_ERROR) {
  17. return E_COMM_ERR;
  18. }
  19. /* Configure the initial state of LDO3 */
  20. if (MAX14690_LDO3SetV(max14690cfg->ldo3mv) != E_NO_ERROR) {
  21. return E_COMM_ERR;
  22. }
  23. if (MAX14690_LDO2SetMode(max14690cfg->ldo2mode) != E_NO_ERROR) {
  24. return E_COMM_ERR;
  25. }
  26. return E_NO_ERROR;
  27. }
其中#define MAX14690_I2CM MXC_I2CM2 /**< Using I2C Master 0 Base Peripheral Address. */
  1. /**
  2. * I2C Master system configuration object for communicating with the MAX14690.
  3. */
  4. const sys_cfg_i2cm_t max14690_sys_cfg = {
  5. .clk_scale = CLKMAN_SCALE_DIV_1,
  6. .io_cfg = IOMAN_I2CM2(IOMAN_MAP_A, 1)
  7. };
QQ截图20170702220301.png 这些都在安装开发工具中都有,详细请看另一篇帖子MAX32630开发工具,需要注意的是,这个开发工具安装好以后,源代码都是MAX32630-EVKIT评估板上的源代码,比如源代码驱动MAX14690是使用I2CM0的,而MAX32630FTHR应用平台是使用I2CM2的,需要做相应的修改才能驱动成功。 总结,其实从MAX32630-EVKIT评估板上移植程序到MAX32630FTHR应用平台上并不难,关键是看懂资料,所有资料都在这里开发必备资料。另外附上MAX32630-EVKIT评估板的原理图资料,大家可以做个比较,改程序就简单了 MAX32630-EVKIT-MAX32631-EVKIT.pdf (3.15 MB, 下载次数: 0) 最后给出我的main函数的程序:
  1. /**
  2. * @file main.c
  3. *
  4. */
  5. #define MAX14690_I2C_ADDRESS (0x50 >> 1)
  6. #define MAX14690_I2CM2 MXC_I2CM2 /**< Using I2C Master 0 Base Peripheral Address. */
  7. /***** Includes *****/
  8. #include <stdio.h>
  9. #include <stdint.h>
  10. #include "mxc_config.h"
  11. #include "board.h"
  12. #include "lp.h"
  13. #include "gpio.h"
  14. #include "tmr.h"
  15. #include "tmr_utils.h"
  16. #include "max14690.h"
  17. #include "i2cm.h"
  18. const max14690_cfg_t max14690_cfg2 = {
  19. .ldo2mv = 3300, /**< 3.3v in mV, connected to VDDB */
  20. .ldo2mode = MAX14690_LDO_MPC1, /**< Enalbe LDO2 when +5v is present on VBUS */
  21. .ldo3mv = 3300, /**< 3.3v is L3OUT -- optional */
  22. .ldo3mode = MAX14690_LDO_ENABLED /**< Enable the LDO. */
  23. };
  24. const gpio_cfg_t LED[] = {
  25. { PORT_2, PIN_4, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
  26. { PORT_2, PIN_5, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
  27. { PORT_2, PIN_6, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
  28. };
  29. void GPIO_Initial()
  30. {
  31. GPIO_Config(&LED[0]);
  32. GPIO_Config(&LED[1]);
  33. GPIO_Config(&LED[2]);
  34. }
  35. #define CLOCK 23
  36. /*------------------------------------------------------------
  37. usÑóê±oˉêy
  38. ------------------------------------------------------------*/
  39. void delay_us(uint32_t us)
  40. {
  41. uint32_t n;
  42. while(us--)for(n=0;n<CLOCK;n++);
  43. }
  44. /*------------------------------------------------------------
  45. msÑóê±oˉêy
  46. ------------------------------------------------------------*/
  47. void delay_ms(uint32_t ms)
  48. {
  49. while(ms--)delay_us(1000);
  50. }
  51. /******************************************************************************/
  52. int main(void)
  53. {
  54. GPIO_Initial();
  55. MAX14690_Init(&max14690_cfg2);
  56. while(1)
  57. {
  58. GPIO_OutClr(&LED[0]);
  59. GPIO_OutSet(&LED[1]);
  60. GPIO_OutSet(&LED[2]);
  61. delay_ms(1000);
  62. GPIO_OutSet(&LED[0]);
  63. GPIO_OutClr(&LED[1]);
  64. GPIO_OutSet(&LED[2]);
  65. delay_ms(1000);
  66. GPIO_OutSet(&LED[0]);
  67. GPIO_OutSet(&LED[1]);
  68. GPIO_OutClr(&LED[2]);
  69. delay_ms(1000);
  70. }
  71. }
实验现象: 本帖最后由 Justice_Gao 于 2017-7-3 16:06 编辑

回复评论 (3)

不错,很全面,谢谢分享
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2017-7-3 10:11
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复