S32K312 IIC DMA配置

        本文主要描述S32K312使用DMA方式进行IIC通信的配置。在工程中,尽可能减少非必要的中断,然而,官方例程中给的demo,是使用LPI2C_USING_INTERRUPTS方式的。因此,本文记录了IIC的DMA方式配置过程。

        1、Pins配置

使用PTD13和PTD14作为LPI2C_0的SDA和SCL。

        2、 时钟使用默认的40MHz。

        3、外设需添加Lpi2c和Dma_Ip。

其中,Dma_Ip的配置如图所示:

Lpi2c的配置如图所示:

main.c文件

#include "Mcal.h"
#include "Clock_Ip.h"
#include "Lpi2c_Ip.h"
#include "Siul2_Port_Ip.h"

volatile int exit_code = 0;
/* User includes */
#define I2C_MASTER   0U
#define I2C_SYNC_TIMEOUT ( 10*100)

uint8 rxBuffer[16] = {0x00, };
uint8 txBuffer[4] = {0x75, 0x00, };

/*!
  \brief The main function for the project.
  \details The startup initialization sequence is the following:
 * - startup asm routine
 * - main()
*/
int main(void)
{
    /* Write your code here */
	Lpi2c_Ip_StatusType status;
	/* Init clock  */
	Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);

	/* Init Pins */
	Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS0, g_pin_mux_InitConfigArr0);
	/* Init master module */
	Lpi2c_Ip_MasterInit(I2C_MASTER, &I2c_Lpi2cMasterChannel0_BOARD_InitPeripherals);

	Lpi2c_Ip_MasterSetSlaveAddr(I2C_MASTER, 0x69, false);
	/* Send data non-blocking */
	status = Lpi2c_Ip_MasterSendDataBlocking(I2C_MASTER, txBuffer, 1, false, I2C_SYNC_TIMEOUT);
	if (LPI2C_IP_SUCCESS_STATUS != status)
	{
		return -1;
	}

	status = Lpi2c_Ip_MasterReceiveDataBlocking(I2C_MASTER, rxBuffer, 1, true, I2C_SYNC_TIMEOUT);
	if (LPI2C_IP_SUCCESS_STATUS != status)
	{
		return -1;
	}

    for(;;)
    {
        if(exit_code != 0)
        {
            break;
        }
    }
    return exit_code;
}

测试中,我使用的从设备是icm42670,slave地址是0x69,发送0x75来获取型号。返回1字节0x67。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值