SPI设备支持问题咨询 | How to use the SPI Device

hello,好的,谢谢,想请教一下,您那边有没有添加过SPI的设备,我这边加载了几次驱动,好像都没有识别。

先确认你的dts里的这个电压是不是配置为正确的:&vcc_1v8
image

android代码有kernel\drivers\spi\spi-w25q128fw-test.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/of.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#include <linux/spi/spidev.h>

#include <linux/fs.h>
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/cdev.h>
#include <linux/gpio.h>
#include <linux/input.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/ioctl.h>
#include <linux/soc/rockchip/rk_vendor_storage.h>


#define w25q128fw_DEVICE_ID 0x6018
#define w25q128fw_SPI_READ_ID_CMD 0x9F
static int w25q128fw_id=0;//0:NG,1:OK
static int w25q128fw_spi_read_id(struct spi_device *spi)
{
	int	status;
	char tbuf[] = {w25q128fw_SPI_READ_ID_CMD};
	char rbuf[3];
	status = spi_write_then_read(spi, tbuf, sizeof(tbuf), rbuf, sizeof(rbuf));
	if (status == 0){ 
		printk("w25q128fw: ID = %02x %02x %02x\n",rbuf[0], rbuf[1], rbuf[2]); 
		if(w25q128fw_DEVICE_ID==(rbuf[1]<<8|rbuf[2])){
			printk("w25q128fw is ok\n"); 
			w25q128fw_id=1;
		}
		else
			w25q128fw_id=0;
	}
	else {
		printk("%s: read ID error\n", __FUNCTION__); 
		w25q128fw_id=0;
	}
	return status;
}

static int w25q128fw_spi_probe(struct spi_device *spi)
{
    int ret = 0;
    struct device_node __maybe_unused *np = spi->dev.of_node;
	
    printk("w25q128fw_spi_probe\n");
	
	if(!spi)	
		return -ENOMEM;
	printk("w25q128fw_spi_probe: setup mode %d, %s%s%s%s%u bits/w, %u Hz max\n",
			(int) (spi->mode & (SPI_CPOL | SPI_CPHA)),
			(spi->mode & SPI_CS_HIGH) ? "cs_high, " : "",
			(spi->mode & SPI_LSB_FIRST) ? "lsb, " : "",
			(spi->mode & SPI_3WIRE) ? "3wire, " : "",
			(spi->mode & SPI_LOOP) ? "loopback, " : "",
			spi->bits_per_word, spi->max_speed_hz);
	w25q128fw_spi_read_id(spi);	
    return ret;
}

static struct of_device_id w25q128fw_match_table[] = {
	{ .compatible = "khadas,rk3399-spi",},
	{},
};
	
static struct spi_driver w25q128fw_spi_driver = {
	.driver = {
		.name = "w25q128fw-spi",
		.owner = THIS_MODULE,
		.of_match_table = w25q128fw_match_table,
	},
	.probe = w25q128fw_spi_probe,
};
		
static int w25q128fw_spi_init(void)
{
	return spi_register_driver(&w25q128fw_spi_driver);
}
module_init(w25q128fw_spi_init);

static void w25q128fw_spi_exit(void)
{
	spi_unregister_driver(&w25q128fw_spi_driver);
}
module_exit(w25q128fw_spi_exit);

MODULE_AUTHOR("goenjoy <goenjoy@khadas.com>");
MODULE_DESCRIPTION("khadas SPI TEST Driver");
MODULE_LICENSE("GPL");

电压配置没问题,驱动程序应该没问题,因为现在开机打印信息里没有看到关于spi的设备信息,感觉是设备树配置得有问题,想请教一下您那边有没有设备树配置spi的例子?

还有想请教一下这个电压配置是有什么作用吗?

&spi1 {
spi_test: spi_test@00{
compatible = “khadas,rk3399-spi”;
reg = <0x00>;
spi-max-frequency = <48000000>;
status = “okay”;
};
};

电压匹配,配置不对,spi会有问题

hello,我们现在外设芯片用的就是3.3V的电平,是不是这里就不需要改成1.8V?

image
看红色箭头,这电源域接的是1.8V,所以dts要配置对应的1.8V。
你的外设要改成1.8V。

hello,现在spi的clk用逻辑分析仪抓,或者用示波器一直是低电平是什么原因呢?

当初我也遇到过这个问题,抓不到波形,后面在读写函数上连续读写2000次才能抓到。