硬件接口说明:
主板上JSPI接口,插座线序说明:


| 序号 | 说明 | 备注 |
|---|---|---|
| 1 | 3.3V | 3.3V电源 |
| 2 | SPICLK | SPI时钟 |
| 3 | SPIMISO | |
| 4 | SPIMOSI | |
| 5 | SPICS | 片选 |
| 6 | GND | 电源地 |
1.1 SPI有4种模式,如下:
CPOL(时钟极性) 和 CPHA(时钟相位) 的不同组合,形成了SPI总线的不同模式.不同SPI从设备支持的模式.
| 模式 | CPOL | CPHA |
|---|---|---|
| 模式一 | 0 | 0 |
| 模式二 | 0 | 1 |
| 模式三 | 1 | 0 |
| 模式四 | 1 | 1 |
1.2 时序图样例
.png)
以下以ubuntu-22.04.x-desktop-amd64 版本为例,
依次输入如下命令,即可添加spi节点.
这些命令是临时添加SPI节点,需要程序中启动的时候加入这些命令,这样后面才能正常使用SPI
jb@K1:~$ sudo modprobe spidev
jb@K1:~$ echo spidev | sudo tee /sys/bus/spi/devices/spi-SPI1001:00/driver_override
jb@K1:~$ echo spi-SPI1001:00 | sudo tee /sys/bus/spi/drivers/spidev/bind
jb@K1:~$ sudo chmod 666 /dev/spidev0.0
jb@K1:~$ ls /dev/spi*
/dev/spidev0.0
添加SPI节点下载现成的脚本:mkspi.sh 用sudo权限执行
http://dd.youyeetoo.cn:5000/sharing/RYIHfvSjp
下载Linux-spi测试软件源码
linux-SPI-test-src-File
解压后,进入linux-spi文件夹,

源码目录结构说明:
| 文件 | 说明 |
|---|---|
| spi.h | SPI底层操作封装 |
| spi.c | SPI底层操作封装 |
| SpiCtrl.h | SPI应用接口头文件 |
| SpiCtrl.cpp | SPI应用接口源文件 |
| test_spi.cpp | 测试代码main |
| Makefile | make编译脚本文件 |
需要下载基本的编译工具,参考"Linux应用程序开发(调用硬件)"描述
编译和运行测试程序如下如下:
#编译
jb@K1:~/linx-spi$ make
#执行
jb@K1:~/linx-spi$ sudo ./test_spi
若上面流程没有错误,执行程序结果如下;
$ sudo ./test_spi
打开spi成功,同步读写操作
SPI_FullDuplex成功,读取内容:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
bye
接口文件SpiCtrl.h说明
#ifndef _SPI_CTRL_H
#define _SPI_CTRL_H
#include <stdint.h>
#include "spi.h"
class SpiCtrl
{
private:
spi_t *spi;
public:
SpiCtrl();
~SpiCtrl();
public:
/**
* @brief : 打开连接SPI总线
* @param {char} *path: spi总线路径 :/dev/spix
* @param {unsigned int} mode:模式:0,1,2,3
* @param {uint32_t} max_speed:速率
* @return {*}返回0成功,其他失败
**/
int32_t Open(const char *path, unsigned int mode,uint32_t max_speed);
/**
* @brief : 打开连接SPI总线 高级方法
* @param {char} *path: spi总线路径 :/dev/spix
* @param {unsigned int} mode:模式:0,1,2,3
* @param {uint32_t} max_speed:速率
* @param {spi_bit_order_t} bit_order:大端小端MSB_FIRST,LSB_FIRST
* @param {uint8_t} bits_per_word:设置SPI通信的字长
* @param {uint8_t} extra_flags:扩展参数
* @return {*}返回0成功,其他失败
**/
int32_t open_advanced(const char *path, unsigned int mode,uint32_t max_speed, spi_bit_order_t bit_order,uint8_t bits_per_word, uint8_t extra_flags);
/**
* @brief : 释放SPI总线
* @return {*}
**/
void Release();
/**
* @brief : SPI总线是否打开
* @return {*}
**/
bool isOpen();
/**
* @brief : SPI 先写后读数据
* @param {uint8_t} *lpWriteBuf:待写数据内存
* @param {int32_t} WriteBuf_len:数据长度
* @param {uint8_t} *lpReadBuf:待读数据内存
* @param {int32_t} ReadBuf_len:数据长度
* @return {*}返回0成功,其他失败
**/
int32_t SPI_WriteRead( uint8_t *lpWriteBuf, int32_t WriteBuf_len, uint8_t *lpReadBuf, int32_t ReadBuf_len);
/**
* @brief : SPI 仅写
* @param {uint8_t} *lpWriteBuffer:待写数据内存
* @param {int32_t} WriteLength:数据长度
* @return {*}返回0成功,其他失败
**/
int32_t SPI_Write( uint8_t *lpWriteBuffer, int32_t WriteLength);
/**
* @brief : SPI 同步写读
* @param {uint8_t} *lpWriteBuf:待写数据内存
* @param {uint8_t} *lpReadBuf:待同步读数据内存
* @param {int32_t} len:数据长度
* @return {*}返回0成功,其他失败
**/
int32_t SPI_FullDuplex( uint8_t *lpWriteBuf, uint8_t *lpReadBuf, int32_t len);
};
#endif

操作流程:
1)选择模式,速率,然后"连接SPI设备"
2)操作:
"SPI仅写":只写不读,需要根据从设备的通讯时序选择该操作.
"SPI先写后读":先写数据给从设备,后续读数据,需要根据从设备的通讯时序选择该操作.
"SPI同步写读":边写数据给从设备同时从设备读数据,需要根据从设备的通讯时序选择该操作.
测试程序qt界面样例源码和如何编译使用,请参考如下页面:
https://wiki.youyeetoo.cn/zh/youyeetooK1/linux/qt-build