自学内容网 自学内容网

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

原文地址:https://blog.csdn.net/pq113_6/article/details/143758266

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!