I2C最常用通讯方式之一,做了一个lpcxpresso55S69学习笔记。
一、引脚配置
通过MCUXpresso Config工具(引脚,时钟,外设)从MCUXpresso lpcxpresso55S69 SDK设置I2C驱动程序,如下是引脚配置:
二、I2C读写实例:
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
#include "fsl_debug_console.h"
#include "fsl_i2c.h"
#include "fsl_gpio.h"
#include "fsl_power.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define SENSOR_I2C_CLK_SRC I2C1_BASE
#define SENSOR_I2C_CLK_FREQ 12000000U
#define I2C_BAUDRATE 100000U
#define I2C_RELEASE_BUS_COUNT 100U
#define BOARD_SENSOR_I2C_BASEADDR I2C1
#define BOARD_SENSOR_I2C_CLOCK_FREQ 12000000
#define DEV_ADDR 0x4C //I2C地址为7位
#define REG_ADDR 0x00
//I2c init
void I2C_InitModule(void)
{
i2c_master_config_t masterConfig;
uint32_t sourceClock = 0;
/*
* masterConfig.baudRate_Bps = 100000U;
* masterConfig.enableStopHold = false;
* masterConfig.glitchFilterWidth = 0U;
* masterConfig.enableMaster = true;
*/
I2C_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps = I2C_BAUDRATE;
sourceClock = SENSOR_I2C_CLK_FREQ;
I2C_MasterInit(BOARD_SENSOR_I2C_BASEADDR, &masterConfig, sourceClock);
}
/*
* base: i2c总线; deviceAddress:设备i2c地址; subAddress:寄存器地址
* subaddressSize:寄存器长度; rxBuff:读到数据; rxBuffSize:一次读几个数据
*/
status_t I2C1_read(I2C_Type *base,
uint8_t deviceAddress,
uint32_t subAddress,
uint8_t subaddressSize,
uint8_t *rxBuff,
uint8_t rxBuffSize)
{
i2c_master_transfer_t masterXfer;
memset(&masterXfer, 0, sizeof(masterXfer));
/* Prepare transfer structure. */
masterXfer.slaveAddress = deviceAddress;
masterXfer.subaddress = subAddress;
masterXfer.subaddressSize = subaddressSize;
masterXfer.data = rxBuff;
masterXfer.dataSize = rxBuffSize;
masterXfer.direction = kI2C_Read;
masterXfer.flags = kI2C_TransferDefaultFlag;
return I2C_MasterTransferBlocking(base, &masterXfer);
}
/*
* base: i2c总线; deviceAddress:设备i2c地址; subAddress:寄存器地址
* subaddressSize:寄存器长度; rxBuff:写到数据; rxBuffSize:一次写几个数据
*/
status_t I2C1_write(I2C_Type *base,
uint8_t deviceAddress,
uint32_t subAddress,
uint8_t subaddressSize,
uint8_t *txBuff,
uint8_t txBuffSize)
{
i2c_master_transfer_t masterXfer;
/* Prepare transfer structure. */
masterXfer.slaveAddress = deviceAddress;
masterXfer.direction = kI2C_Write;
masterXfer.subaddress = subAddress;
masterXfer.subaddressSize = subaddressSize;
masterXfer.data = txBuff;
masterXfer.dataSize = txBuffSize;
masterXfer.flags = kI2C_TransferDefaultFlag;
return I2C_MasterTransferBlocking(base, &masterXfer);
}
int main(void)
{
I2C_InitModule();
//I2C read
uint8_t readBuff;
uint8_t value = 21;
I2C1_read(BOARD_SENSOR_I2C_BASEADDR, DEV_ADDR, DEV_ADDR, 1, &readBuff, 1);
PRINTF("reg0x00: %x\n", readBuff);
//I2C write
I2C1_write(BOARD_SENSOR_I2C_BASEADDR, DEV_ADDR, DEV_ADDR, 1, &value, 1);
return 0;
}
参考链接:https://www.nxpic.org.cn/module/forum/thread-620699-1-1.html