18
- 收藏
- 点赞
- 分享
- 举报
SD3403 连接 MS41908M SPI读取到的值都是0xffff
有大佬用过吗,帮小弟指点一下迷津
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
// 配置
#define SPI_DEVICE "/dev/spidev1.0" // SPI1_0
#define SPI_SPEED 2000000 // 2MHz
#define SPI_BITS 8
#define SPI_MODE SPI_MODE_3 | SPI_LSB_FIRST // CPOL=0,CPHA=0
// MS41908M 固定:24bit 帧 = 读/写位 + 6bit 地址 + 16bit 数据
#define MS41908M_WRITE (0 << 7) // C0=0 写
#define MS41908M_READ (1 << 7) // C0=1 读
// 测试寄存器:0x0C IRSAD(只读,默认0,可读即应答)
#define TEST_ADDR 0x0C
/**
* @brief MS41908M 单寄存器读写
* @param fd SPI 文件描述符
* @param rw 0=写 1=读
* @param addr 6bit 地址(0~63)
* @param data 写数据(16bit),读时无效
* @return 读返回16bit数据,写返回0,失败-1
*/
int ms41908m_rw(int fd, int rw, unsigned char addr, unsigned short data)
{
unsigned char tx[3] = {0};
unsigned char rx[3] = {0};
// 24bit 帧格式:[7:6]保留 [5]C0 [4:0]地址 | [15:0]数据
tx[0] = (rw ? MS41908M_READ : MS41908M_WRITE) | (addr & 0x3F);
tx[1] = (data >> 8) & 0xFF;
tx[2] = data & 0xFF;
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = 3,
.speed_hz = SPI_SPEED,
.bits_per_word = SPI_BITS,
};
if (ioctl(fd, SPI_IOC_MESSAGE(1), &tr) < 0) {
perror("spi transfer failed");
return -1;
}
// 读模式:返回16bit数据
if (rw)
return ((rx[1] << 8) | rx[2]) & 0xFFFF;
return 0;
}
int main(int argc, char *argv[])
{
int fd;
int ret;
unsigned short read_val;
int mode = SPI_MODE;
int bits = SPI_BITS;
int speed = SPI_SPEED;
// 1. 打开 SPI
fd = open(SPI_DEVICE, O_RDWR);
if (fd < 0) {
perror("open spi failed");
return -1;
}
// 2. 设置模式/位宽/速率
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
ret |= ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
ret |= ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
ret |= ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
ret |= ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret < 0) {
perror("spi set param failed");
close(fd);
return -1;
}
printf("MS41908M SPI test start...\n");
// 3. 读测试寄存器(0x0C 只读,能读到数据=芯片应答)
read_val = ms41908m_rw(fd, 1, TEST_ADDR, 0x0000);
if (read_val < 0) {
printf("===== 通信失败:无应答 =====\n");
} else {
printf("===== 通信成功:读到 0x%04X =====\n", read_val);
}
close(fd);
return 0;
}
我来回答
回答1个
时间排序
认可量排序
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片
相关问答
-
2026-01-09 08:58:50
-
2025-06-16 17:40:49
-
2024-03-29 18:11:08
-
2024-11-14 11:28:47
-
2024-12-17 14:38:10
-
2025-12-10 15:00:08
-
2025-07-21 10:12:21
-
2025-05-16 09:40:53
-
2022-05-11 15:52:31
-
2024-08-28 14:17:53
-
2023-06-12 15:49:46
-
2025-07-04 14:56:24
-
2025-02-06 14:13:48
-
2023-06-12 15:59:49
-
2023-06-12 16:01:52
-
2026-01-23 09:04:07
-
2023-06-26 14:32:33
-
2019-04-28 17:20:26
-
2017-09-22 16:14:05
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认

微信扫码分享
QQ好友