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