做航空产品的网站有哪些,上海网页设计制作公司,做电商一般月入多少钱,设计头像网站免费推荐介绍
I2C总线由飞利浦公司开发#xff0c;是一种串行单工通信总线#xff0c;它主要用于连接微控制器和其他外围设备并在总线上的器件之间传送信息#xff08;需要指定设备地址#xff09;#xff1b;常见的i2c设备有EEPROM、触摸屏、各种IoT传感器、时钟模块等#x…介绍
I2C总线由飞利浦公司开发是一种串行单工通信总线它主要用于连接微控制器和其他外围设备并在总线上的器件之间传送信息需要指定设备地址常见的i2c设备有EEPROM、触摸屏、各种IoT传感器、时钟模块等通常由两根线组成SCL和SDA使用时需要接上拉电阻常见的通信速率为100k和400k
移植流程
以i2c0为例
① 在board里边添加相应的外设配置i2c0外设为复位状态、设置GPIO引脚功能
② 添加相应的Kconfig开关用以指示相应的外设开启与关闭本质是通过宏定义或者条件编译的方式
③ 根据SDK_2_14_2_FRDM-MCXA153提供的i2c示例工程编写i2c总线驱动需要实现2个关键的函数
lpc_i2c_xferrt_hw_i2c_init
④ 添加相应的库文件依赖fsl_lpi2c.c、fsl_lpi2c_edma.c
开发板引脚对应关系
序号GPIOfunction1P3_27SCL2P3_28SDA
驱动文件
pin_mux.c
在BOARD_InitPins函数里加入以下代码
#ifdef BSP_USING_I2C0 const port_pin_config_t port3_27_pin34_config {/* Internal pull-up resistor is enabled */kPORT_PullUp,/* Low internal pull resistor value is selected. */kPORT_LowPullResistor,/* Fast slew rate is configured */kPORT_FastSlewRate,/* Passive input filter is disabled */kPORT_PassiveFilterDisable,/* Open drain output is enabled */kPORT_OpenDrainEnable,/* Low drive strength is configured */kPORT_LowDriveStrength,/* Normal drive strength is configured */kPORT_NormalDriveStrength,/* Pin is configured as LPI2C0_SCL */kPORT_MuxAlt2,/* Digital input enabled */kPORT_InputBufferEnable,/* Digital input is not inverted */kPORT_InputNormal,/* Pin Control Register fields [15:0] are not locked */kPORT_UnlockRegister};/* PORT3_27 (pin 34) is configured as LPI2C0_SCL */PORT_SetPinConfig(PORT3, 27U, port3_27_pin34_config);const port_pin_config_t port3_28_pin33_config {/* Internal pull-up resistor is enabled */kPORT_PullUp,/* Low internal pull resistor value is selected. */kPORT_LowPullResistor,/* Fast slew rate is configured */kPORT_FastSlewRate,/* Passive input filter is disabled */kPORT_PassiveFilterDisable,/* Open drain output is enabled */kPORT_OpenDrainEnable,/* Low drive strength is configured */kPORT_LowDriveStrength,/* Normal drive strength is configured */kPORT_NormalDriveStrength,/* Pin is configured as LPI2C0_SDA */kPORT_MuxAlt2,/* Digital input enabled */kPORT_InputBufferEnable,/* Digital input is not inverted */kPORT_InputNormal,/* Pin Control Register fields [15:0] are not locked */kPORT_UnlockRegister};/* PORT3_28 (pin 33) is configured as LPI2C0_SDA */PORT_SetPinConfig(PORT3, 28U, port3_28_pin33_config);
#endifboard/Kconfig
加入i2c0相关配置
menuconfig BSP_USING_I2Cconfig BSP_USING_I2Cbool Enable I2Cselect RT_USING_I2Cdefault yif BSP_USING_I2Cconfig BSP_USING_I2C0bool Enable I2C0default yendifdrv_i2c.c
i2c驱动层修改如下
/** Copyright (c) 2006-2024, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2023-08-17 hywing The first version*/#include rtdevice.h
#include fsl_lpi2c.h
#include fsl_lpi2c_edma.h
#include fsl_edma.h#ifdef RT_USING_I2Cenum
{
#ifdef BSP_USING_I2C0I2C0_INDEX,
#endif
};#define i2c_dbg rt_kprintfstruct lpc_i2c_bus
{struct rt_i2c_bus_device parent;LPI2C_Type *I2C;clock_attach_id_t clock_attach_id;clock_div_name_t clock_div_name;clock_name_t clock_src;uint32_t baud;char *name;
};struct lpc_i2c_bus lpc_obj[]
{
#ifdef BSP_USING_I2C0{.I2C LPI2C0,.baud 100000U,.clock_attach_id kFRO12M_to_LPI2C0,.clock_div_name kCLOCK_DivLPI2C0,.clock_src kCLOCK_Fro12M,.name i2c0,},
#endif
#ifdef BSP_USING_I2C1{.I2C LPI2C1,.baud 100000U,.clock_attach_id kFRO12M_to_FLEXCOMM1,.clock_div_name kCLOCK_DivFlexcom1Clk,.clock_src kCLOCK_Fro12M,.name i2c1,},
#endif
#ifdef BSP_USING_I2C2{.I2C LPI2C2,.baud 100000U,.clock_attach_id kFRO12M_to_FLEXCOMM2,.clock_div_name kCLOCK_DivFlexcom2Clk,.clock_src kCLOCK_Fro12M,.name i2c2,},
#endif
};static rt_ssize_t lpc_i2c_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num)
{struct rt_i2c_msg *msg;lpi2c_master_transfer_t xfer {0};rt_uint32_t i;rt_ssize_t ret 0;struct lpc_i2c_bus *lpc_i2c (struct lpc_i2c_bus *)bus;for (i 0; i num; i){msg msgs[i];if (msg-flags RT_I2C_RD){xfer.slaveAddress msg-addr;xfer.direction kLPI2C_Read;xfer.subaddress 0;xfer.subaddressSize 0;xfer.data msg-buf;xfer.dataSize msg-len;if(i ! 0)xfer.flags kLPI2C_TransferRepeatedStartFlag;elsexfer.flags kLPI2C_TransferDefaultFlag;if (LPI2C_MasterTransferBlocking(lpc_i2c-I2C, xfer) ! kStatus_Success){i2c_dbg(i2c bus read failed!\n);return i;}}else{xfer.slaveAddress msg-addr;xfer.direction kLPI2C_Write;xfer.subaddress 0;xfer.subaddressSize 0;xfer.data msg-buf;xfer.dataSize msg-len;if(i 0)xfer.flags kLPI2C_TransferNoStopFlag;elsexfer.flags kLPI2C_TransferDefaultFlag;if (LPI2C_MasterTransferBlocking(lpc_i2c-I2C, xfer) ! kStatus_Success){i2c_dbg(i2c bus write failed!\n);return i;}}}ret i;return ret;
}static const struct rt_i2c_bus_device_ops i2c_ops
{lpc_i2c_xfer,RT_NULL,RT_NULL
};int rt_hw_i2c_init(void)
{int i;lpi2c_master_config_t masterConfig;for(i0; iARRAY_SIZE(lpc_obj); i){CLOCK_SetClockDiv(lpc_obj[i].clock_div_name, 1u);CLOCK_AttachClk(lpc_obj[i].clock_attach_id);LPI2C_MasterGetDefaultConfig(masterConfig);masterConfig.baudRate_Hz lpc_obj[i].baud;LPI2C_MasterInit(lpc_obj[i].I2C, masterConfig, /*CLOCK_GetFreq(lpc_obj[i].clock_src)*/CLOCK_GetLpi2cClkFreq());lpc_obj[i].parent.ops i2c_ops;rt_i2c_bus_device_register(lpc_obj[i].parent, lpc_obj[i].name);}return RT_EOK;
}
INIT_DEVICE_EXPORT(rt_hw_i2c_init);#endif /* RT_USING_I2C */SConscript
在Libraries/MCXA153/SConscript文件里边加上以下代码
if GetDepend(BSP_USING_I2C):src [MCXA153/drivers/fsl_lpi2c.c]src [MCXA153/drivers/fsl_lpi2c_edma.c]测试用例
打开使能i2c0驱动 使能ssd1306模块并连接SCLP3_27、SDAP3_28引脚 拉取更新软件包并导出MDK5工程
pkgs --update
scons --targetmdk5在msh终端输入ssd1306_TestAll屏幕输出效果如下说明i2c BSP驱动已经正确移植