0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

mmWave SDK demo中集成I2C接口驱动所需的步骤及操作

电子设计 来源:电子设计 作者:电子设计 2022-01-14 10:07 次阅读

作者: TI 工程师 Wesley He

在一些特殊的使用场合,有需要使用AWR1642对PMIC的输出电压进行调节,或是读取PMIC 内部的工作状态,此时需要I2C接口对PMIC进行读写操作,本文介绍了在现有的mmWave SDK demo中集成I2C接口驱动所需的步骤及操作。

本文的测试环境如下:

测试软件版本:mmWave SDK 2.0.0.4

测试硬件:AWR1642BOOST EVM

1. 在mmWave SDK demo中增加I2C驱动代码

第一步是添加代码以包含和初始化I2C驱动程序。从I2C接口发送和接收均需要此驱动程序的支持,以下是在mss_main.c中添加的初始化I2C驱动程序的C代码。此测试代码可以复制到现有工程中。I2C驱动操作步骤为:GPIO初始化,I2C驱动初始化,配置I2C改写PMIC(LP87524B)寄存器以实现PMIC输出电压调节。

注意LP87524B寄存器信息来源于其datasheet:LP87524B/J-Q1具有集成开关的具有集成开关的 4-A + 2.5-A +两个 1.5-A降压稳压器数据表 (Rev. A),I2C驱动参考代码如下:

#include

static int32_t I2C_GPIOInit(void)

{

#if (defined(SOC_XWR14XX))

/* Setup the PINMUX to bring out the XWR14xx I2C pins */

Pinmux_Set_OverrideCtrl(SOC_XWR14XX_PINR3_PADAH, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);

Pinmux_Set_FuncSel(SOC_XWR14XX_PINR3_PADAH, SOC_XWR14XX_PINR3_PADAH_I2C_SDA);

Pinmux_Set_OverrideCtrl(SOC_XWR14XX_PINP4_PADAI, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);

Pinmux_Set_FuncSel(SOC_XWR14XX_PINP4_PADAI, SOC_XWR14XX_PINP4_PADAI_I2C_SCL);

#else

/* Setup the PINMUX to bring out the XWR16xx I2C pins */

Pinmux_Set_OverrideCtrl(SOC_XWR16XX_PINF13_PADAH, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);

Pinmux_Set_FuncSel(SOC_XWR16XX_PINF13_PADAH, SOC_XWR16XX_PINF13_PADAH_I2C_SDA);

Pinmux_Set_OverrideCtrl(SOC_XWR16XX_PING14_PADAI, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);

Pinmux_Set_FuncSel(SOC_XWR16XX_PING14_PADAI, SOC_XWR16XX_PING14_PADAI_I2C_SCL);

#endif

return 0;

}

static int32_t I2C_Communication_Test()

{

bool retVal = false;

int32_t errCode = 0;

uint32_t arg;

uint8_t rxData[16];

uint8_t txData[16];

I2C_Transaction i2cTransaction;

I2C_Handle i2cHandle;

I2C_Params i2cParams;

/* Reset the transmit and receive buffer */

memset(&rxData, 0, sizeof (rxData));

/* Initializa the I2C driver */

I2C_init();

/* Initialize the I2C driver default parameters */

I2C_Params_init(&i2cParams);

i2cParams.transferMode = I2C_MODE_BLOCKING;

i2cParams.bitRate = I2C_100kHz;

/* Open the I2C driver */

i2cHandle = I2C_open(0, &i2cParams);

if (i2cHandle == NULL)

{

System_printf ("Error: I2C Driver Open failed\n");

return -1;

}

/* Configure the I2C device in I2C_CMD_ADDR_MODE mode */

arg = 0;//arg set to 0, and the I2C addr mode is 7-bit.

errCode = I2C_control (i2cHandle, I2C_CMD_ADDR_MODE, (void* )&arg);

if (errCode < 0)

{

System_printf ("Error: I2C control Set I2C_CMD_ADDR_MODE failed [Error code %d]\n", errCode);

return -1;

}

//read the LP87524B buck3 output voltage register

txData[0] = 0x10;

i2cTransaction.slaveAddress = 0x60;//LP87524B/J-Q1 Device Address = 0x60

i2cTransaction.writeBuf = txData;

i2cTransaction.writeCount = 1;

i2cTransaction.readBuf = rxData;

i2cTransaction.readCount = 1;

retVal = I2C_transfer(i2cHandle, &i2cTransaction);

if (retVal == false)

{

System_printf ("Error: I2C Transfer failed\n");

return -1;

}

System_printf("I2C_READ: addr=0x%x, Val=0x%x\n",txData[0],rxData[0]);

//write the LP87524B buck3 output voltage = 2.0V

txData[0] = 0x10;

txData[1] = 0xbb;//default=0xca,2.3V,0xb1=1.8V, 0xbb=2.0V

i2cTransaction.slaveAddress = 0x60;//LP87524B/J-Q1 Device Address = 0x60

i2cTransaction.writeBuf = txData;

i2cTransaction.writeCount = 2;

i2cTransaction.readBuf = rxData;

i2cTransaction.readCount = 0;

retVal = I2C_transfer(i2cHandle, &i2cTransaction);

if (retVal == false)

{

System_printf ("Error: I2C Transfer failed\n");

return -1;

}

System_printf("I2C_Write: LP87524B buck3 = 2.0V Done\n");

//read the LP87524B buck3 output voltage register

txData[0] = 0x10;

i2cTransaction.slaveAddress = 0x60;//LP87524B/J-Q1 Device Address = 0x60

i2cTransaction.writeBuf = txData;

i2cTransaction.writeCount = 1;

i2cTransaction.readBuf = rxData;

i2cTransaction.readCount = 1;

retVal = I2C_transfer(i2cHandle, &i2cTransaction);

if (retVal == false)

{

System_printf ("Error: I2C Transfer failed\n");

return -1;

}

System_printf("I2C_READ: addr=0x%x, Val=0x%x\r\n",txData[0],rxData[0]);

//write the LP87524B buck2 output voltage = 1.5V

txData[0] = 0x0e;

txData[1] = 0Xa2;//default=0xb1,1.8V, 0x4d=1V 0xa2=1.5V

i2cTransaction.slaveAddress = 0x60;//LP87524B/J-Q1 Device Address = 0x60

i2cTransaction.writeBuf = txData;

i2cTransaction.writeCount = 2;

i2cTransaction.readBuf = rxData;

i2cTransaction.readCount = 0;

retVal = I2C_transfer(i2cHandle, &i2cTransaction);

if (retVal == false)

{

System_printf ("Error: I2C Transfer failed\n");

return -1;

}

System_printf("I2C_Write: LP87524B buck2 = 1.5V Done\n");

if (retVal == false)

{

System_printf ("Error: I2C combined Transfer to Slave failed\n");

return -1;

}

/* Close I2C driver */

I2C_close(i2cHandle);

return 0;

}

//Call these function in void MmwDemo_mssInitTask(UArg arg0, UArg arg1)

errCode = I2C_GPIOInit();

if (errCode == -1)

System_printf("I2C_GPIOInit Error\r\n");

errCode = I2C_Communication_Test();

if (errCode == -1)

System_printf("I2C_Communication_Test Error\n");

else

System_printf("I2C_Communication_Test Done\n");

2. 将工程链接到I2C驱动库

最后一步是通过链接I2C驱动程序来构建可执行文件。 如果使用CCS项目,可以将I2C驱动程序添加到项目的链接器属性中,如图1所示。

pYYBAGGKVg2ALnqyAADCaMnHFx0296.png

图1. CCS Project Linker Properties

如果使用makefile编译工程,执行相同的程序。

###################################################################################

# Additional libraries which are required to build the DEMO:

###################################################################################

MSS_MMW_DEMO_STD_LIBS = $(R4F_COMMON_STD_LIB) \

-llibpinmux_$(MMWAVE_SDK_DEVICE_TYPE).$(R4F_LIB_EXT) \

-llibdma_$(MMWAVE_SDK_DEVICE_TYPE).$(R4F_LIB_EXT) \

-llibcrc_$(MMWAVE_SDK_DEVICE_TYPE).$(R4F_LIB_EXT) \

-llibuart_$(MMWAVE_SDK_DEVICE_TYPE).$(R4F_LIB_EXT) \

-llibgpio_$(MMWAVE_SDK_DEVICE_TYPE).$(R4F_LIB_EXT) \

-llibmailbox_$(MMWAVE_SDK_DEVICE_TYPE).$(R4F_LIB_EXT) \

-llibmmwavelink_$(MMWAVE_SDK_DEVICE_TYPE).$(R4F_LIB_EXT) \

-llibmmwave_$(MMWAVE_SDK_DEVICE_TYPE).$(R4F_LIB_EXT) \

-llibcli_$(MMWAVE_SDK_DEVICE_TYPE).$(R4F_LIB_EXT) \

-llibi2c_$(MMWAVE_SDK_DEVICE_TYPE).$(R4F_LIB_EXT)

MSS_MMW_DEMO_LOC_LIBS = $(R4F_COMMON_LOC_LIB) \

-i$(MMWAVE_SDK_INSTALL_PATH)/ti/drivers/pinmux/lib \

-i$(MMWAVE_SDK_INSTALL_PATH)/ti/drivers/uart/lib \

-i$(MMWAVE_SDK_INSTALL_PATH)/ti/drivers/dma/lib \

-i$(MMWAVE_SDK_INSTALL_PATH)/ti/drivers/crc/lib \

-i$(MMWAVE_SDK_INSTALL_PATH)/ti/drivers/gpio/lib \

-i$(MMWAVE_SDK_INSTALL_PATH)/ti/drivers/mailbox/lib \

-i$(MMWAVE_SDK_INSTALL_PATH)/ti/control/mmwavelink/lib \

-i$(MMWAVE_SDK_INSTALL_PATH)/ti/control/mmwave/lib \

-i$(MMWAVE_SDK_INSTALL_PATH)/ti/utils/cli/lib \

-i$(MMWAVE_SDK_INSTALL_PATH)/ti/utils/i2c/lib

3. 运行测试例程

运行测试程序后,CCS控制台输出打印信息如下,使用万用表测量LP87524输出电压即为设置的电压,I2C驱动添加成功。

**********************************************

Debug: Launching the Millimeter Wave Demo

**********************************************

I2C_READ: addr=0x10, Val=0xca

I2C_Write: LP87524B buck3 = 2.0V Done

I2C_READ: addr=0x10, Val=0xbb

I2C_Write: LP87524B buck2 = 1.5V Done

I2C_Communication_Test Done

审核编辑:何安

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    12

    文章

    1824

    浏览量

    85169
  • 嵌入式处理
    +关注

    关注

    0

    文章

    341

    浏览量

    9993
收藏 人收藏

    评论

    相关推荐

    RISC V的I2C操作

    :RISC V的I2C操作 文章出处:【微信公众号:易灵思FPGA技术交流】欢迎添加关注!文章转载请注明出处。
    的头像 发表于 11-01 11:06 120次阅读

    使用TAS5805 DEMO板PPC3 I2C monitor进行I2C命令调试,读写命令总是错误,为什么?

    使用TAS5805 DEMO板,试用 PPC3 I2C monitor 进行I2C命令调试,读写命令总是错误,示波器检查波形发现device address 左移了一位,相当于除2
    发表于 10-12 06:47

    在低成本MSP430 MCU中集成I2C I/O扩展器

    电子发烧友网站提供《在低成本MSP430 MCU中集成I2C I/O扩展器.pdf》资料免费下载
    发表于 09-24 10:56 0次下载
    在低成本MSP430 MCU<b class='flag-5'>中集成</b><b class='flag-5'>I2C</b> <b class='flag-5'>I</b>/O扩展器

    mmWave SDK增加QSPI Flash驱动的示例

    电子发烧友网站提供《在mmWave SDK增加QSPI Flash驱动的示例.pdf》资料免费下载
    发表于 09-11 14:20 0次下载
    在<b class='flag-5'>mmWave</b> <b class='flag-5'>SDK</b>增加QSPI Flash<b class='flag-5'>驱动</b>的示例

    I2C基本指南

    电子发烧友网站提供《I2C基本指南.pdf》资料免费下载
    发表于 09-10 09:40 0次下载
    <b class='flag-5'>I2C</b>基本指南

    I2C接口+高度集成的电源管理芯片PMIC-iML1942

    电源管理芯片 - iML1942是一个高度集成的电源管理IC为TFT液晶面板。它具有完整的I2C接口来编程各种参数。
    的头像 发表于 07-05 09:27 537次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>接口</b>+高度<b class='flag-5'>集成</b>的电源管理芯片PMIC-iML1942

    如何通过cyusb3014的i2c操作界面操作ads1119的i2c接口

    我使用 cyusb3014 作为 i2c 设备的主机,并使用 ads1119 采集电压。 我需要使用 i2c 操作相关指令。 例子中提供的示例只显示了读写步骤,即 dev_ Addr+
    发表于 05-23 07:30

    I2C接口的8位LED驱动器TPIC2810数据表

    电子发烧友网站提供《带I2C接口的8位LED驱动器TPIC2810数据表.pdf》资料免费下载
    发表于 04-09 15:41 0次下载
    带<b class='flag-5'>I2C</b><b class='flag-5'>接口</b>的8位LED<b class='flag-5'>驱动</b>器TPIC2810数据表

    什么是I2C协议 I2C总线的控制逻辑

    在实际使用过程中,I2C比较容易出现的一个问题就是死锁 ,死锁在I2C中主要表现为:I2C死锁时表现为SCL为高,SDA一直为低。
    发表于 03-12 09:17 946次阅读
    什么是<b class='flag-5'>I2C</b>协议 <b class='flag-5'>I2C</b>总线的控制逻辑

    详解I2C接口协议

    I2C总线是由荷兰皇家飞利浦Philips公司(现恩智浦NXP半导体)开发的一种简单的双向两线制总线协议标准。
    发表于 03-07 10:22 1934次阅读
    详解<b class='flag-5'>I2C</b><b class='flag-5'>接口</b>协议

    i2c接口由哪几根线组成 i2c接口可以接哪些器件

    I2C接口的线路可以适应不同的系统需求和器件规格,因此具体的线路配置可能会有所不同。但通常来说,时钟线(SCL)和数据线(SDA)是I2C接口的核心线路。
    的头像 发表于 03-05 16:55 3642次阅读
    <b class='flag-5'>i2c</b><b class='flag-5'>接口</b>由哪几根线组成 <b class='flag-5'>i2c</b><b class='flag-5'>接口</b>可以接哪些器件

    GD32 MCU硬件I2C不可靠不如软件I2C?来看看红枫派开发版的硬件I2C驱动如何做到稳得一批

    在一个评论中,看到网友对硬件I2C的讨论,硬件I2C Busy找不到原因、软件I2C稳得一批。
    的头像 发表于 02-23 09:37 2687次阅读
    GD32 MCU硬件<b class='flag-5'>I2C</b>不可靠不如软件<b class='flag-5'>I2C</b>?来看看红枫派开发版的硬件<b class='flag-5'>I2C</b><b class='flag-5'>驱动</b>如何做到稳得一批

    什么是I2C接口?什么是I3C接口I2CI3C的区别

    I2C接口是一种串行通信协议,全称为Inter-Integrated Circuit,即集成电路间总线。它是一种双向、两线制(SCL和SDA)的串行通信接口,主要用于连接微控制器和其他
    的头像 发表于 02-17 14:39 5486次阅读
    什么是<b class='flag-5'>I2C</b><b class='flag-5'>接口</b>?什么是<b class='flag-5'>I3C</b><b class='flag-5'>接口</b>?<b class='flag-5'>I2C</b>与<b class='flag-5'>I3C</b>的区别

    XV4001BC车载用SPI/I2C输出接口的数字输出

    XV4001BC车载用SPI/I2C输出接口的数字输出,可实现角速度输出和温度传感器输出,满足汽车导航和通讯系统的要求。SPI / I2C 输出接口角速度输出(16bit)、温度传感
    发表于 01-02 16:33 0次下载

    i2c接口和spi接口区别

    I2C(Inter-Integrated Circuit)和SPI(Serial Peripheral Interface)都是用于设备间通信的串行接口标准。它们在很多方面有着相似之处,但也有一些
    的头像 发表于 12-25 15:02 3764次阅读