背景
SPI的读写框架使用
代码
#include <linux/spi/spi.h>
// 假设 spi_device 已经定义并初始化
// 读取寄存器
int reg_read(struct spi_device *spi, u16 reg_addr, u32 *reg_val) {
u8 tx_buf[6] = {0}; // 2 个字节的地址 + 4 个字节的寄存器值
u8 rx_buf[6] = {0};
struct spi_transfer transfer = {
.tx_buf = tx_buf,
.rx_buf = rx_buf,
.len = 6,
};
struct spi_message message;
// 准备传输数据
tx_buf[0] = (reg_addr >> 8) & 0xFF; // 地址的高 8 位
tx_buf[1] = reg_addr & 0xFF; // 地址的低 8 位
spi_message_init(&message);
spi_message_add_tail(&transfer, &message);
// 执行 SPI 传输
int ret = spi_sync(spi, &message);
if (ret < 0) {
// 错误处理
return ret;
}
// 从 rx_buf 读取寄存器值
*reg_val = (rx_buf[2] << 24) | (rx_buf[3] << 16) | (rx_buf[4] << 8) | rx_buf[5];
return 0;
}
// 写入寄存器
int reg_write(struct spi_device *spi, u16 reg_addr, u32 reg_val) {
u8 tx_buf[6] = {0}; // 2 个字节的地址 + 4 个字节的寄存器值
struct spi_transfer transfer = {
.tx_buf = tx_buf,
.len = 6,
};
struct spi_message message;
// 准备传输数据
tx_buf[0] = (reg_addr >> 8) & 0xFF;
tx_buf[1] = reg_addr & 0xFF;
tx_buf[2] = (reg_val >> 24) & 0xFF;
tx_buf[3] = (reg_val >> 16) & 0xFF;
tx_buf[4] = (reg_val >> 8) & 0xFF;
tx_buf[5] = reg_val & 0xFF;
spi_message_init(&message);
spi_message_add_tail(&transfer, &message);
// 执行 SPI 传输
return spi_sync(spi, &message);
}