根据传入的spi_device参数,可以找到对应的spi_master。接下来就可以利用spi子系统为我们完成数据交互了。可以参看m25p80_read函数。要完成传输,先理解下面几个结构的含义:(这两个结构的定义及详细注释参见include/linux/spi/spi.h)
spi_message:描述一次完整的传输,即cs信号从高->底->高的传输
spi_transfer:多个spi_transfer够成一个spi_message
举例说明:m25p80的读过程如下图
可以分解为两个spi_ transfer一个是写命令,另一个是读数据。具体实现参见m25p80.c中的m25p80_read函数。下面内容摘取之此函数。
structspi_transfer t[2]; //定义了两个spi_transfer
structspi_message m; //定义了一个spi_message
spi_message_init(&m);//初始化其transfers链表
t[0].tx_buf = flash->command;
t[0].len = CMD_SIZE + FAST_READ_DUMMY_BYTE;//定义第一个transfer的写指针和长度
spi_message_add_tail(&t[0],&m);//添加到spi_message
t[1].rx_buf = buf;
t[1].len = len; //定义第二个transfer的读指针和长度
spi_message_add_tail(&t[1],&m); //添加到spi_message
flash->command[0] = OPCODE_READ;
flash->command[1] = from >> 16;
flash->command[2] = from >> 8;
flash->command[3] = from; //初始化前面写buf的内容
spi_sync(flash->spi,&m); //调用spi_master发送spi_message
//spi_sync为同步方式发送,还可以用spi_async异步方式,那样的话,需要设置回调完成函数。
另外你也可以选择一些封装好的更容易使用的函数,这些函数可以在include/linux/spi/spi.h文件中找到,如:
extern int spi_write_then_read(struct spi_device*spi,
const u8 *txbuf, unsigned n_tx,
u8 *rxbuf, unsigned n_rx);
这篇文章就到这了,下篇给出一个针对m25p10完整的驱动程序。