Rockchip SPI (serial peripheral interface) 有如下特点
其驱动已适配Linux下标准的SPI驱动框架。
板上的30pin座子引出了一路SPI,且存在复用关系。要使用此SPI,需要修改内核,将这些引脚复用为SPI。具体操作参考
引脚为如下几个
SPI作为userspace用途时通常会加载spidev驱动,生成的节点为spidevx.y(x为控制器序号,y为片选号)。此组SPI的节点为/dev/spidev0.0。下面通过在硬件上短接SPI0的MISO 和MOSI,来进行收发测试,接线如下
"/dev/spidev0.0"的节点都需要root权限才能操作,使用命令行或者C语言编译出来的程序操作都需要root权限。如果是ssh或者使用LX终端的,先执行如下命令获取root权限。
sudo su
通过连接 libperipheral_api.a 静态库,可以使用C语言调用以下接口来操作SPI
/**
* @name: user_spi_open
* @description: 打开 spidev 设备
* @param i2c_num: spi号
* @param spi_cs: spi片选号
* @return 大于等于0 - 成功,返回值为文件描述符 小于0 - 失败
*/
int user_spi_open(int spi_num,int spi_cs);
/**
* @name: user_spi_write_read
* @description: 从spi设备读写数据spi通讯是全双工的只读可以配置write_buf内容为0 只写可以丢弃read_buf内容
* @param fd: 文件描述符,user_spi_open返回值
* @param write_buf: spi写数据指针
* @param read_buf: spi读数据指针
* @param addr_len: 寄存器地址长度
* @param len: 读写数据长度
*
* @return 等于0 - 成功 小于0 - 失败
*/
int user_spi_write_read(int fd, unsigned char* write_buf,unsigned char* read_buf,unsigned int len);
/**
* @name: user_spi_close
* @description: 关闭spi
* @param fd: 文件描述符,user_spi_close 返回值
* @return 始终等于0,无意义
*/
int user_spi_close(int fd);
SPI是同步信号,由主器件提供时钟,而主器件必须要发送数据(可以全部是0x00)才能发出时钟,从器件收到主器件的时钟之后,才能发送数据。
测试demo如下,以操作 spidev0.0 为例,短接MISO MOSI
#include "peripheral_api.h"
void spi_api_test(void)
{
int ret = 0;
int fd = -1;
unsigned char buf_write[5] = {0};
unsigned char buf_read[5] = {0};
for (unsigned char i = 0; i < sizeof(buf_write); i++) {
buf_write[i] = 0x32 + i;
}
fd = user_spi_open(0, 0);
if (fd < 0) {
printf("user_spi_open fail \n");
return;
}
ret = user_spi_write_read(fd, buf_write, buf_read, sizeof(buf_read));
if (ret < 0) {
printf("user_spi_write_read fail \n");
user_spi_close(fd);
return;
}
user_spi_close(fd);
if (memcmp(buf_write, buf_read, sizeof(buf_write)) == 0) {
printf("buf_write buf_read same\n");
} else {
printf("buf_write buf_read diff %d %d %d %d %d \n", buf_read[0], buf_read[1], buf_read[2], buf_read[3], buf_read[4]);
}
return;
}
int main()
{
spi_api_test();
return 0;
}
将peripheral_api.a静态库、peripheral_api.h和测试demo源码test.c放到同一路径下,编译命令如下
aarch64-none-linux-gnu-gcc test.c peripheral_api.a -I. -o spitest
运行结果如下