FPGA学习笔记23之LINUX下SPI调试
FPGA学习笔记23之LINUX下SPI调试
- 若该文为原创文章,未经允许不得转载
- 风释雪
- QQ:627833006
- E-mail:hn.cy@foxmail.com
- CSDN博客地址:https://blog.csdn.net/weixin_46718879
1.版本说明
| Data | Author | Version Revision |
|---|---|---|
| 2021/02/28 | abner | 1.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);