当前位置: 首页 > article >正文

ftdi_sio应用学习笔记 5 - SPI

目录

1. 查找设备

2. 打开设备

3. 验证

3.1 遍历设备

3.2 打开关闭设备

3.3 读flash id


SPI的SCK/MOSI/MISO分别对应(A/B)D0/D1/D2,其他IO作为CS。和I2C一样,最大支持2路MPSSE通道,一路MPSSE最大13路SPI。

#define FTDI_DEVICE_MAX_INTEFACE_SPI    2
#define FTDI_DEVICE_MAX_SPI             13

定义spi设备的信息结构体

struct ftdi_spi_info {
    struct ftdi_spi_info *next;
    int spi_master[FTDI_DEVICE_MAX_INTEFACE_SPI];
    //int spi_index[FTDI_DEVICE_MAX_INTEFACE_SPI][FTDI_DEVICE_MAX_SPI]; 
    char tty_name[FTDI_DEVICE_MAX_INTEFACE_SPI][10];
    int pid;
    int vid;
    char serial_number[64];
};

1. 查找设备

spi设备的编号可以在ttyUSBn的spi_master目录下找到,例如

:/sys/bus/usb/devices/2-1/2-1:1.0/ttyUSB0/spi_master/spi0$ ls
device  spi0.0  spi0.2  spi0.4      subsystem
power   spi0.1  spi0.3  statistics  uevent

对于MPSSE设备,一路MPSSE只会有一个spi master,所以只需要找到"spi0"这里面的编号0。

DIR *spi_dir;
struct dirent *spi_entry;
int spi_index = 0;

sprintf(dev_list->tty_name[interface], "%s", tty_entry->d_name);
sprintf(name_path, "/sys/bus/usb/devices/%s:1.%d/%s/spi_master", entry->d_name, interface, tty_entry->d_name);
spi_dir = opendir(name_path);
if (spi_dir == NULL) {  
    break;
}
while ((spi_entry = readdir(spi_dir)) != NULL) {
    if (strstr(spi_entry->d_name, "spi") != NULL) {  
        printf("Found:%s\n", spi_entry->d_name);
        sscanf(spi_entry->d_name, "spi%d", &dev_list->spi_master[interface]);
        break;
    } 
}
closedir(spi_dir);

将这个编号保存起来,至于下一级的编号,肯定是固定的从0开始计数,直到最大12(对于FT4232H最大直到5)。

2. 打开设备

打开设备和i2c设备一样分2种情况

int open_spi(int pid, int n, int interface, int num, int freq);
int open_spi(char *serial_number, int interface, int num, int freq);

参数:

pid - FTDI设备的PID号

n - 需要打开的同PID号的第n个设备

num - 该设备的第num个spi设备

freq - 设置该设备的频率,Hz为单位

返回spi设备的设备句柄。

找到对应的设备号后打开文件即可。

char dev_path[PATH_MAX];
int fd;
sprintf(dev_path, "/dev/spidev%d.%d", dev_list->spi_master[interface], num);
printf("open:%s\n", dev_path);
if ((fd = open(dev_path, O_RDWR)) < 0) {
    perror("Failed to open the spi bus\n");
}
return fd;  

3. 验证

通过FT4232H验证,将BD0/BD1/BD2/BD3接入spi nor flash,即spidev1.0。

3.1 遍历设备

ftdi_sio_spi spi;
spi.find_devices();

spi.free_devices();

打印结果:

serial number:FT9PQ9R2
Found:spi0
Found:spi1

3.2 打开关闭设备

int fd;
    
spi.find_devices();
fd = spi.open_spi((char *)"FT9PQ9R2", 1, 0);
if(fd < 0) {
    printf("open spi device fail %d\n", fd);
}
    
spi.close_spi(fd);

打印结果:

open:/dev/spidev1.0

3.3 读flash id

flash_id = sflashReadJedecID(fd);
printf("flash id: 0x%x\n", flash_id);

打印结果:

sflash Winbond
sflash size 16MB, 24bits address
flash id: 0xef4018

http://www.kler.cn/a/408607.html

相关文章:

  • 短信发送业务
  • JDBC 详解:从基础到高级完全指南
  • 【v5lite】调用onnx推理
  • CANDENCE: 绘制好的封装元件 刷新(Refresh) 和 替换 (Replace)焊盘
  • AR智能眼镜|AR眼镜定制开发|工业AR眼镜方案
  • Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
  • Spring Security @PreAuthorize注解
  • Ubuntu20.04安装ROS1
  • 微信小程序被攻击怎么选择高防产品
  • 如何通过docker容器将ASP.NET Core站点部署到CentOS
  • 【python系列】python数据类型之字典
  • Vue (一)
  • Linux笔记---进程:进程切换与O(1)调度算法
  • 微前端+qiankun
  • 3DEXPERIENCE软件是干什么的—3DE软件代理商微辰三维
  • WebApis学习笔记,第二节:高级语法
  • 数据结构 (5)栈
  • 问:Spring Boot应用监控组件工具,梳理一下?
  • hhdb数据库介绍(9-30)
  • 【大数据学习 | Spark-Core】详解分区个数
  • strongswan测试流程
  • STM32 UART的DMA与非DMA性能对比
  • LeetCode 135.分发糖果
  • Load-Balanced-Online-OJ(负载均衡式在线OJ)
  • ubuntu16.04在ros使用USB摄像头-解决could not open /dev/video0问题
  • Ubuntu22.04配置强化学习环境及运行相关Demo