FPGA学习笔记23之LINUX下SPI调试

FPGA学习笔记23之LINUX下SPI调试

1.版本说明

DataAuthorVersion Revision
2021/02/28abner1.0 初定版本

2.概述

ZYNQ/MPSOC SPI驱动和应用层调试;

3.内核配置

Device Drivers  ---> 
    [*] SPI support  --->
        <*>   User mode SPI device driver support

3.设备树配置

&spi0 {
    status = "okay";
    spidev@0 {
        compatible = "rohm,dh2228fv";
        spi-max-frequency = <48000000>;
        reg = <0>;
    };
};

4.测试demo

独立编译应用

aarch64-linux-gnu-gcc spidev_test.c -o spi-tools-2.0

在这里插入图片描述

测试:
在这里插入图片描述

5.软件实现

bool CDevSPI::PolledTransfer(const uint8_t *tx, uint8_t *rx, size_t len)
{
    int fd;
    int ret = 0;

    fd = open(sysfs_spi_path_.c_str(), O_RDWR);
    if (fd < 0)
    {
        cout << "ERR: Can't open spi device " << endl;
    }

	/*
	 * spi mode
	 */

    ret = ioctl(fd, SPI_IOC_WR_MODE32, &mode_);
    if (ret == -1)
    {
		cout << "can't set spi mode" << endl;
    }

    ret = ioctl(fd, SPI_IOC_RD_MODE32, &mode_);
    if (ret == -1)
    {
		cout << "ERR: can't get spi mode" << endl;
    }

	/*
	 * bits per word
	 */

    ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits_);
    if (ret == -1)
    {
		    cout << "ERR: can't set bits per word " << endl;
    }

    ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits_);
    if (ret == -1)
    {
		cout << "ERR: can't get bits per word " << endl;
    }

	/*
	 * max speed hz
	 */

    ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed_);
    if (ret == -1)
    {
    	cout << "ERR: can't set max speed hz " << endl;
    }

    ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed_);
    if (ret == -1)
    {
    	cout << "ERR: can't get max speed hz " << endl;
    }


    cout << "info: SPI MODE = " << dec << (int)mode_ << endl;
    cout << "info: SPI BITS = " << dec << (int)bits_ << endl;
    cout << "info: SPI MAX SPEED = " << dec << (int)speed_ << endl;

    struct spi_ioc_transfer tr;
    memset((void *)&tr, 0, sizeof(struct spi_ioc_transfer));
	tr.tx_buf = (unsigned long)tx;
	tr.rx_buf = (unsigned long)rx;
	tr.len = len;
	tr.delay_usecs = delay_;
	tr.speed_hz = speed_;
	tr.bits_per_word = bits_;

    ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
    if (ret < 1)
    {
		cout << "ERR: can't send spi message" << endl;
    }

    close(fd);