Linux下SPI驱动开发(3)

根据传入的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完整的驱动程序。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwgfwj.html