1.i2c dma测试验证效果如下:

串口打印输出

prj.conf配置 主要的
c
CONFIG_LOG=y
CONFIG_I2C=y
CONFIG_I2C_STM32=y
CONFIG_I2C_STM32_V2_DMA=y
CONFIG_DMA_LOG_LEVEL_DBG=y
CONFIG_I2C_LOG_LEVEL_DBG=y
app.overlay 配置
c
&dma1 {
status = "okay";
};
&dmamux1 {
status = "okay";
};
&i2c1 {
pinctrl-0 = <&i2c1_scl_pb6 &i2c1_sda_pb7>;
pinctrl-names = "default";
status = "okay";
clock-frequency = <100000>; /* 100kHz */
// mpu6050: mpu6050@68 { //使用mpu6050传感器,测试模块时打开
// compatible = "invensense,mpu6050";
// reg = <0x68>;
// status = "okay";
// };
//使用i2c dma传输时打开下面的
dmas = <&dmamux1 0 34 (STM32_DMA_PERIPH_TX | STM32_DMA_PRIORITY_HIGH)>,
<&dmamux1 1 33 (STM32_DMA_PERIPH_RX | STM32_DMA_PRIORITY_HIGH)>;
dma-names = "tx", "rx";
};
&pinctrl {
i2c1_scl_pb6: i2c1_scl_pb6 {
pinmux = <STM32_PINMUX('B', 6, AF4)>;
drive-open-drain;
bias-pull-up;
};
i2c1_sda_pb7: i2c1_sda_pb7 {
pinmux = <STM32_PINMUX('B', 7, AF4)>;
bias-pull-up;
};
};
main.c中主要的处理代码
c
#include <zephyr/drivers/sensor.h>
#include <zephyr/drivers/i2c.h>
#define MPU6050_NODE DT_NODELABEL(mpu6050)
#define I2C_DEV_NODE DT_NODELABEL(i2c1)
void my_thread(void *arg1, void *arg2, void *arg3)
{
printk("=== my_thread STARTED ===\n"); // <--- 加这一行
// const struct device *dev = DEVICE_DT_GET(MPU6050_NODE);
// struct sensor_value accel[3]; /* X, Y, Z 加速度 */
// struct sensor_value gyro[3]; /* X, Y, Z 角速度 */
// struct sensor_value temp; /* 温度 */
// if (!device_is_ready(dev)) {
// printk("MPU6050 device not found!\n");
// // return -1;
// }
// printk("MPU6050 initialized successfully!\n");
//仅仅测试i2c dma 发送 功能。
uint8_t tx_buffer[3] = {0x10, 0x20, 0x30};
const struct device *dev = DEVICE_DT_GET(I2C_DEV_NODE);
if (!device_is_ready(dev)) {
printk("I2C device not found!\n");
// return -1;
}
while (1) {
int ret = i2c_write(dev, tx_buffer, sizeof(tx_buffer), 0x68);
if (ret < 0) {
printk("I2C write failed: %d\n", ret);
} else {
printk("I2C write succeeded: ");
}
// /* 获取传感器数据 */
// if (sensor_sample_fetch(dev) < 0) {
// printk("Sensor sample fetch failed\n");
// k_sleep(K_MSEC(100));
// continue;
// }
// /* 读取加速度 (m/s?) */
// sensor_channel_get(dev, SENSOR_CHAN_ACCEL_XYZ, accel);
// /* 读取角速度 (rad/s) */
// sensor_channel_get(dev, SENSOR_CHAN_GYRO_XYZ, gyro);
// /* 读取温度 (℃) */
// sensor_channel_get(dev, SENSOR_CHAN_DIE_TEMP, &temp);
// /* 打印结果 */
// double ax = sensor_value_to_double(&accel[0]);
// double ay = sensor_value_to_double(&accel[1]);
// double az = sensor_value_to_double(&accel[2]);
// double gx = sensor_value_to_double(&gyro[0]);
// double gy = sensor_value_to_double(&gyro[1]);
// double gz = sensor_value_to_double(&gyro[2]);
// double temp_val = sensor_value_to_double(&temp);
// /* 计算倾斜角度 */
// double pitch = atan2(ay, az) * 180.0 / 3.1415926; /* 前后倾斜 */
// double roll = atan2(ax, az) * 180.0 / 3.1415926; /* 左右倾斜 */
// printk("\n========================================\n");
// printk(" MPU6050 姿态报告\n");
// printk("========================================\n");
// printk(" 前后倾斜: %+.1f°\n", pitch);
// printk(" 左右倾斜: %+.1f°\n", roll);
// printk(" 加速度 X: %.1f m/s?\n", ax);
// printk(" 加速度 Y: %.1f m/s?\n", ay);
// printk(" 加速度 Z: %.1f m/s?\n", az);
// printk(" 旋转速度 X: %.2f rad/s\n", gx);
// printk(" 旋转速度 Y: %.2f rad/s\n", gy);
// printk(" 旋转速度 Z: %.2f rad/s\n", gz);
// printk(" 芯片温度: %.1f °C\n", temp_val);
// if (pitch < 5 && pitch > -5 && roll < 5 && roll > -5) {
// printk(" 状态: ? 水平放置\n");
// } else {
// printk(" 状态: ?? 倾斜放置\n");
// }
// if (gx < 0.05 && gx > -0.05 && gy < 0.05 && gy > -0.05 && gz < 0.05 && gz >
// -0.05) { printk(" 状态: ? 静止\n"); } else { printk(" 状态: ?
// 运动中\n");
// }
// printk("========================================\n\n");
k_msleep(700);
}
}
上面中注释掉的是i2c传感器的测试代码。
打开传感器就可看到:
