ST意法半导体
直播中

哈哈哈

9年用户 845经验值
擅长:可编程逻辑
私信 关注
[问答]

请问如何使用read(2)系统调用从st25dvo4k的用户区读取数据?

st25dv04k 与 i.mx6 接口。我们在 i.mx6 上安装内核版本 4.9.88-10182-gec7d7d8-dirty。我用 c 写了下面的代码。
#include
#include
#include
#include
#include <时间.h>
#include tinet/in.h>
#include
#define地址 0x53
诠释主要(){
诠释;
无符号字符缓冲区[3];
无符号字符缓冲区 1[2];
if ((fd = open("/dev/i2c-2", O_RDWR)) < 0) { printf("无法打开设备!%dn", fd); 返回 1;}
如果 (ioctl(fd, I2C_SLAVE, 地址) < 0)   
{
printf("在地址上找不到设备!n"); 返回 1;
}
缓冲区[0] = 0x00;
缓冲区[1] = 0x00;
缓冲区[2] = 0x65;
如果(写(fd,缓冲区,3)!= 3)
{
printf("错误处理:i2c 事务失败n");
}
别的
printf("i2c 写入成功n");
睡眠(5000);
缓冲区 1[0] = 0x00;
缓冲区 1[1] = 0x00;
//缓冲区1[2] = 0x65;
如果(读取(fd,缓冲区 1,2)!= 2)
{
   printf("无法从 i2c 总线读取。nn");
}
别的 {
   printf("读取成功n");
    printf("值: %02xnn", buffer1[0]);
    printf("值: %02xnn", buffer1[1]);
}
关闭(fd);
返回 0;
}
//////////////////////
q] 在上面的代码中写什么来从 2 字节的寄存器地址读取值?
q] 这是正确的读写方法吗?如果不是那么我需要在上面的代码中做些什么才能写入用户区域?
q] 我需要在上面的代码中写什么 ndef 序列字节来发送“文本数据”?
q] 我的主要目的是在 NFC 标签 ic st25dv04k 中写入数据。那个ic是作为奴隶工作的。我们的主人是第二个 i.mx6 板。当标签连接到从 ic 时。当主人靠近这个标签时,我需要将书面文本数据发送给主人。那么在上面的代码中应该怎么做呢?






回帖(1)

冯栋

2023-1-17 09:39:10
在回答您的问题之前,请注意 ST25DV-I2C I2C 操作在DS10925 的第 6 章(寻址字节、START 和 STOP 条件)中进行了描述。
另请注意,您正在实施的内容已在STSW-ST25DV007 包(可在st.com上获得)的文件Drivers/BSP/Linux/st25dv-i2c_linux.c中提供,并且应该可在任何 Linux 平台上重复使用。
然后关于你的代码代码:


  • “写入”将在地址 0 处写入字节 0x65。
  • 读取函数将触发ST25DV-I2C的“当前地址读取”序列(参见DS10925的图29),当前地址是您写入的最后一个字节之后的下一个字节(即地址1),结果read 将从地址 1 和 2 返回 2 个字节。

要读回写入的数据,您需要触发“随机地址读取”序列(在 DS10925 的图 29 中也有描述)。
这可以使用ioctl(filehande, I2C_RDWR, &payload); 来实现;
有效负载是一个 i2c_rdwr_ioctl_data 结构,带有 2 个部分消息:


  • 为内存地址写入 2 个字节
  • 与 1 个字节的读取链接(不重新呈现设备地址)

从 Drivers/BSP/Linux/st25dv-i2c_linux.c 中提取的代码
结构 i2c_msg 消息[2] = {
    {
      .addr = DevAddr >>1,
      .buf = 注册地址,
      .len = 2,
      .flags = 0,
    },
    {
      .addr = DevAddr >>1,
      .buf = pData,
      .len = 长度,
      .flags = I2C_M_RD | I2C_M_NOSTART,
    }
  };
结构 i2c_rdwr_ioctl_data 有效负载 = {
    .msgs = 消息,
    .nmsgs = 2,
  };
  ret = ioctl(文件句柄,I2C_RDWR,&payload);
  如果(返回 < 0){
    ret = -错误号;
    printf("rn读取@%X (devAddr=%X)rn", ret,Reg,DevAddr 时出错 %d);
    返还;
  }

然后关于 NDEF 文本,STSW-ST25DV007 包提供了一个用于构建 NDEF 消息的中间件。
您可以查看 NDEF_URI 或 NDEF_BLUETOOTH 项目作为示例(提供的中间件也允许构建 NDEF 文本记录)。
例如,在 NDEF_URI 项目中,只需将NDEF_WriteURI(&URI)替换为
#include "lib_NDEF_Text.h"
NDEF_WriteText( "这将被格式化为 NDEF 文本记录" );
举报

更多回帖

发帖
×
20
完善资料,
赚取积分