2.3 Openwrt 模拟 spi 及其sx1301寄存器读写测试

本节提示:
        本节所需环境: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时序图:2.3 Openwrt 模拟 spi 及其sx1301寄存器读写测试_第1张图片从上图可以知道SX1301 SPI 为模式0。对SPI不是很了解的小伙伴可以参考:https://blog.csdn.net/weixin_42509369/article/details/83096349
(2)编写SX1301 SPI读写函数
在此之前需要注意芯片手册中的一段话,意思是:第一字节为寄存器地址,其中MSB(最高有效位)为 1代表写操作、0代表读操作,剩下的7bit为要访问的地址。
2.3 Openwrt 模拟 spi 及其sx1301寄存器读写测试_第2张图片
相关定义:(完整测试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数据手册:
在这里插入图片描述2.3 Openwrt 模拟 spi 及其sx1301寄存器读写测试_第3张图片
选取:地址0x01、0x22、0x23、0x24、0x25
默认初始值为:
在这里插入图片描述
2.3 Openwrt 模拟 spi 及其sx1301寄存器读写测试_第4张图片
编写寄存器读写测试程序如下:

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

得到如下结果:

2.3 Openwrt 模拟 spi 及其sx1301寄存器读写测试_第5张图片
至此读写测试完成,本篇博文只将整个过程需要注意的重点指出,并未给出完整源码,完整测试源码(需配合前面的步骤设置GPIO,否则测试程序无效):
参考:https://blog.csdn.net/iotisan/article/details/72633960
参考:https://blog.csdn.net/yangzheng_yz/article/details/50470577

你可能感兴趣的:(2.3 Openwrt 模拟 spi 及其sx1301寄存器读写测试)