我正在尝试学习如何编写基本的SPI驱动程序,下面是我编写的探测函数。
我在这里尝试设置spi设备以用于fram(datasheet),并使用
当我执行此代码时,我可以使用逻辑分析仪看到SPI总线上的数据,但无法使用rx缓冲区读取它。我错过了什么吗?请有人帮帮我吗?
我在这里尝试设置spi设备以用于fram(datasheet),并使用
spi_sync_transfer()
api description从芯片中获取制造商ID。当我执行此代码时,我可以使用逻辑分析仪看到SPI总线上的数据,但无法使用rx缓冲区读取它。我错过了什么吗?请有人帮帮我吗?
static int fram_probe(struct spi_device *spi)
{
int err;
unsigned char ch16[] = {0x9F,0x00,0x00,0x00};// 0x9F => 10011111
unsigned char rx16[] = {0x00,0x00,0x00,0x00};
printk("[FRAM DRIVER] fram_probe called \n");
spi->max_speed_hz = 1000000;
spi->bits_per_word = 8;
spi->mode = (3);
err = spi_setup(spi);
if (err < 0) {
printk("[FRAM DRIVER::fram_probe spi_setup failed!\n");
return err;
}
printk("[FRAM DRIVER] spi_setup ok, cs: %d\n", spi->chip_select);
spi_element[0].tx_buf = ch16;
spi_element[1].rx_buf = rx16;
err = spi_sync_transfer(spi, spi_element, ARRAY_SIZE(spi_element)/2);
printk("rx16=%x %x %x %x\n",rx16[0],rx16[1],rx16[2],rx16[3]);
if (err < 0) {
printk("[FRAM DRIVER]::fram_probe spi_sync_transfer failed!\n");
return err;
}
return 0;
}
spi_driver
的探测函数,通过使用module_spi_driver()
注册一个struct spi_driver
来创建。所以我认为将其称为SPI驱动程序是完全合理的。另一种类型是主驱动程序,由一个struct spi_master
定义,并使用spi_register_master()
进行注册。 - TrentP