一、在zephyr上使用i2c+dma传输/i2c设备测试

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传感器的测试代码。

打开传感器就可看到: