本节提示:
本节所需环境:ubuntu 16 / 18
工具:VScode、Cmake、openwrt 交叉编译器
2.3 Openwrt 模拟 spi 及其sx1301寄存器读写测试
通过前面两章节的操作,完成了MT7628 GPIO复用功能的配置和openwrt系统GPIO驱动的加载。本环节将进行linux 应用层模拟spi的编写。
2.3.1 openwrt 模拟SPI 读写函数的编写
(1)数据手册找出sx1301 SPI工作模式(也可通过分析LoRa Gateway 官方源码)
下图为sx1301 SPI时序图:从上图可以知道SX1301 SPI 为模式0。对SPI不是很了解的小伙伴可以参考:https://blog.csdn.net/weixin_42509369/article/details/83096349
(2)编写SX1301 SPI读写函数
在此之前需要注意芯片手册中的一段话,意思是:第一字节为寄存器地址,其中MSB(最高有效位)为 1
代表写操作、0
代表读操作,剩下的7bit为要访问的地址。
相关定义:(完整测试Cmake工程)
#define scl_L set_scl_low()
#define scl_H set_scl_high()
#define mosi_L set_mosi_low()
#define mosi_H set_mosi_high()
#define rest_L set_rest_low()
#define rest_H set_rest_high()
#define cs_L set_cs_low()
#define cs_H set_cs_high()
typedef unsigned char byte;
typedef unsigned short word;
SPI读函数:
byte SPIRead8bit(void)
{
byte RdPara = 0;
byte bitcnt;
cs_L;
mosi_H;
for(bitcnt=8; bitcnt!=0; bitcnt--)
{
scl_L;
RdPara <<= 1;
scl_H;
if(get_miso_value())
{
RdPara |= 0x01;
}
else
{
;
}
}
scl_L;
return(RdPara);
}
SPI写函数:
void SPICmd8bit(byte WrPara)
{
byte bitcnt;
cs_L;
scl_L;
for(bitcnt = 8; bitcnt != 0; bitcnt--)
{
scl_L;
if(WrPara&0x80)
{
mosi_H;
}
else
{
mosi_L;
}
scl_H;
WrPara <<= 1;
}
scl_L;
mosi_H;
}
连续读函数:
void SPIReadBuffer(byte adr,byte *buffer,int size)
{
int i;
adr=adr & 0x7F;
SPICmd8bit(adr); //发送要读取的地址
for(i=0;i
连续写函数:
void SPIWrite_cmd(byte adr,byte *buffer,int size)
{
adr= ( adr & 0x7F ) | 0x80;
SPICmd8bit(adr); //发送要读取的地址
for(int i=0;i
2.3.2 sx1301 寄存器读写测试
打开sx1301数据手册:
选取:地址0x01、0x22、0x23、0x24、0x25
默认初始值为:
编写寄存器读写测试程序如下:
int test()
{
spi_simulate_io_init();//GPIO初始化
SPIWrite_byte(0x00,0x00);//设置寄存器第一页
while(1)
{
printf("%x--%x--%x--%x--%x\t\n",SPIread_byte(0x01),SPIread_byte(0x22),SPIread_byte(0x23),SPIread_byte(0x24),SPIread_byte(0x25));
}
}
所在目录终端输入:cmake .
—>make
上传至mt7628 执行:
chmod 777 spi_simulate
./spi_simulate
得到如下结果:
至此读写测试完成,本篇博文只将整个过程需要注意的重点指出,并未给出完整源码,完整测试源码(需配合前面的步骤设置GPIO,否则测试程序无效):
参考:https://blog.csdn.net/iotisan/article/details/72633960
参考:https://blog.csdn.net/yangzheng_yz/article/details/50470577