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时序图:在这里插入图片描述从上图可以知道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<size;i++)
         {
         buffer[i] = SPIRead8bit();    //读取数据    
         }
         cs_H;
}
byte SPIread_byte(byte adr)//读单个数据
{
      byte temp[2];
     SPIReadBuffer(adr,temp,1);
     return temp[0];
}

连续写函数:

void SPIWrite_cmd(byte adr,byte *buffer,int size)
{
  
  adr= ( adr  & 0x7F ) | 0x80;
  SPICmd8bit(adr);               //发送要读取的地址
  for(int i=0;i<size;i++)
  {
  SPICmd8bit(buffer[i]);               //发送要读取的地址
  }
  cs_H;
}

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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值