本文主要描述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。