Pārlūkot izejas kodu

!COMMIT_MESSAGE!

dropLin 9 mēneši atpakaļ
vecāks
revīzija
28ac1053ac
5 mainītis faili ar 33 papildinājumiem un 202 dzēšanām
  1. 25 94
      README.md
  2. 6 1
      keil_v5/project.uvoptx
  3. 1 1
      project/main.c
  4. 1 103
      radio/spi.c
  5. 0 3
      radio/spi.h

+ 25 - 94
README.md

@@ -1,11 +1,15 @@
 ## 一、项目名称
 adapterBoardDriver
+
 ## 二、产品类型
 演示板
+
 ## 三、应用场景
 无线数据收发、测试通讯距离
+
 ## 四、传感器及驱动接口
+
 ## 五、按键
 6个
 1. `S1`按键可以移动光标(选择的项会反显)向上选择设置项,或向上设置数值,可以循环移动选择
@@ -13,28 +17,35 @@ adapterBoardDriver
 1. `S3`按键可以移动光标(选择的项会反显)向下选择设置项,或向上设置数值,可以循环移动选择
 1. `S4`按键功能待定
 1. `S5`按键,功能1:开机界面时,按下进入功能选择界面。功能2:确定选择项目。功能3:退出设置状态
+   
 ## 六、LED指示灯
 2个
 1. `D5`蓝色LED,发送成功指示灯灯
 2. `D4`红色LED,接收成功指示灯灯
+3. 
 ## 七、显示器类型及驱动接口 
 深圳市晶联讯电子的液晶模块`JLX19296G-382-PN`
 该液晶模块支持4线SPI串行接口和IIC接口,本项目使用IIC接口驱动,显示大小192*96 点阵
+
 ## 八、功耗要求
+
 ## 九、供电方式
 支持三种供电
 1. USB的MICRO-B插头供电
 1. 3*5号电池供电
 1. 2pin的PH座子供电,注意电压不能超过5V
+
 ## 十一、尺寸
+
 87mm*131.5mm
 ## 十二、射频频段
-433MHz、490MHz、868MHz、915MHz
+
 ## 十三、射频芯片方案
-`SX1268`、`SX1262`、`LLCC68`
+
 ## 十四、主控芯片方案
 `AT32F413RCT7`该MCU与`STM32F103RCT6`软硬件兼容
+
 ## 十五、认证要求
 ## 十六、外部连接接口
@@ -51,104 +62,30 @@ C99标准
 ## 十九、SDK版本
 `STM32F10x_StdPeriph_Lib_V3.5.0`
 ## 二十、功能描述
-<div >
-<img src="image/mainUi.png"  height="150" width="200">
-<img src="image/select_tx.png"  height="150" width="200">
-<img src="image/packettx.png"  height="150" width="200">
-<img src="image/packetrx.png"  height="150" width="200">
-<img src="image/continuous.png"  height="150" width="200">
-</div>
 
 ### 数据包收发测试
 #### 发送测试
-`主界面`<img src="image/mainUi.png"  height="60" width="85">-->按键`S5`-->功能选择`Enter RF Transmiter`<img src="image/select_tx.png"  height="60" width="85">-->按键`S5`-->进入`Packet Tx`<img src="image/packetTx.png"  height="60" width="85">-->按键`S5`-->开始发送,同时`START`会闪烁显示
-发送完成后,6S内收到ACK,会立即触发重新发送,同时会重新设置重发超时时间(从开始发送到接收到ACK的时间),超时后自动重发,超时重发10次后,重发超时时间自动切换回6S。
-发送成功`D5`蓝色LED灯闪烁一下。
-
-如图<img src="image/packetTx.png"  height="160" width="195">
-1. `413ms`为从开始发送到无线收到对方回复的应答所消耗的时间,若该处显示`OUT`,则表示接收等待ACK超时。
-2. `100%`为统计的丢包率,重新按下按键`S5`重新计数
-3. `hello world?`为无线收到的数据包,其中的`?`位置的字符每次都会不一样
-4. `-004dBm`为最新一次无线收到的数据包的信号强度
-#### 接收测试
-`主界面`<img src="image/mainUi.png"  height="60" width="85">-->按键`S5`-->功能选择`Enter RF Receiver`<img src="image/select_rx.png"  height="60" width="85">-->按键`S5`-->进入`Packet Rx`<img src="image/packetRx.png"  height="60" width="85">-->按键`S5`-->开始接收,同时`START`会闪烁显示
-收到数据后`D4`红色LED灯闪烁一下
 
-如图<img src="image/packetRx.png"  height="160" width="195">
-1. `11.67mA`为当前无线模组的工作电流
-1. `-13dBm`为最新一次无线收到的数据包的信号强度
-1. `hello world2`、`hello world3`、`hello world4`为无线收到的3个数据包,收到新的数据包时显示会向上滚动
+#### 接收测试
 ### 数据收发软件实现
 #### 周期性发送流程
-<img src='https://g.gravizo.com/svg?
- digraph G {
-   初始化 -> 进入接收状态[style=bold,label="设置模组型号:\nmyRadio_setChipType\n初始化射频:\nmyRadio_init"];
-   进入接收状态 -> 按键操作进入发送测试[style=bold,label="myRadio_receiver"];
-   按键操作进入发送测试 -> 周期时间到[style=bold,label="myRadio_receiver"];
-   周期时间到 -> 调用射频发送[style=bold,label="myRadio_transmit"];
-   调用射频发送 -> 发送完成[style=bold,label="产生回调:\nrfRx_callback\n状态值:\nTX_STA_SECCESS"];
-   发送完成 -> 重新进入接收状态[style=bold,label="myRadio_receiver"];
- }
-'/>
+
+
 ### 功能参数设置
-<div align="center">
-<img src="image/setting.png"  height="150" width="200">
-</div>
-
-`主界面`<img src="image/mainUi.png"  height="60" width="85">-->按键`S5`-->功能选择`Enter RF Setting`<img src="image/select_set.png"  height="60" width="85">-->按键`S5`-->进入`Setting`<img src="image/setting.png"  height="60" width="85">,按下`S1`或者`S3`切换设置项目,确定需要设置的项目后,按下`S5`进行参数设置,该项的光标会闪烁显示,此时可通过按键`S1`或者`S3`上下调节参数。再按下`S5`退出设置,即可选择其他选项设置。
-1. `Type`,设置选择对应的模组型号,当前demo板的固件可能会兼容多个型号的模组,比如以下型号的模组可以共用一套驱动固件
-    1.  VG2379S433N0S1
-    2.  VG2379S490N0S1
-    3.  VG2373S868N0S1
-    4.  VG2373S915N0S1
-    5.  VGdd79S170N0S1
-    6.  VGdd79S433N0S1
-    7.  VGdd79S490N0S1
-    8.  VGdd79S868N0S1
-    9.  VGdd79S915N0S1
-    10. VG2379S433X0M1
-    11. VG2379S490X0M1
-    12. VG2373S868X0M1
-    13. VG2373S915X0M1
-    14. VGdd79S170X0M1
-    15. VGdd79S433X0M1
-    16. VGdd79S490X0M1
-    17. VGdd79S868X0M1
-    18. VGdd79S915X0M1
-    19. VG2379S433N0SA
-    20. VG2379S490N0SA
-    21. VG2373S868N0SA
-    22. VG2373S915N0SA
-    23. VGdd79S170N0SA
-    24. VGdd79S433N0SA
-    25. VGdd79S490N0SA
-    26. VGdd79S868N0SA
-    27. VGdd79S915N0SA
-2. `Chnl`,设置当前模组的无线信道,信道对应的无线率会根据`Type`类型和`Step`信道间隔的设置而改变
-3. `Step`,信道间隔,即每个信道之间的频率带宽,该设置需根据实际情况而定,不宜太小,过小的间隔可能会造成不同信道的设备串频造成干扰。
-4. `TxPower`,无线发射功率。发射功率越大,功耗越高,相应的通讯距离也会越远
-5. `RfBr`,无线波特率。无线波特率的大小即传输速率的大小,无线波特率越大,传输消耗时间越小,相应的传输距离越短,反之则越远。最终的通讯距离,在排除外在因素的情况下,可以从无线发射功率和无线波特率这两个参数评估
 ## 二十一、备注说明
 ### 射频驱动移植
-1. 需要将文件夹`radio`中的API全部移植,与硬件相关的已全部定义在`radio/myRadio_gpio.c`中,若目标平台也是C语言环境,将文件夹`radio`中的文件拷贝过来后,只需对应的修改`radio/myRadio_gpio.c`文件中的GPIO定义既可,由于`myRadio_gpio.c`中用到的GPIO是宏定义在`project/board.h`,所以也需要将`radio/board.h`中的定义移植过来。如果MCU平台也是相近的,只需修改`project/board.h`中对应的宏定义即可。
+1. 需要将文件夹`radio`中的API全部移植,与硬件相关的已全部定义在`radio/spi.c`中,若目标平台也是C语言环境,将文件夹`radio`中的文件拷贝过来后,只需对应的修改`radio/spi.c`文件中的GPIO定义既可,由于`spi.c`中用到的GPIO是宏定义在`project/board.h`,所以也需要将`radio/board.h`中的定义移植过来。如果MCU平台也是相近的,只需修改`project/board.h`中对应的宏定义即可。
 2. 本公司为了统一demo程序,将射频相关的操作重新定义了一层,详见`radio/myRadio.c`,无线应用开发,可以参考借鉴。
 ### 射频芯片驱动IO口说明
 驱动IO口均定义在`project/board.h`中
- 1. BOARD_GPIO_SPI_CLK
- 2. BOARD_GPIO_SPI_MISO
- 3. BOARD_GPIO_SPI_MOSI
- 4. BOARD_GPIO_SPI_CSN
- 5. BOARD_GPIO_SPI_GPIOA -> 直连射频芯片的`RST`引脚,上电初始化需要用到
- 6. BOARD_GPIO_SPI_GPIOB -> 直连射频芯片的`IO1`引脚,用于接收芯片操作的中断响应输出指示,本工程该引脚用于做发送接收中断响应指示,用户可以配置中断映射功能
- 7. BOARD_GPIO_SPI_GPIOC -> 直连射频芯片的`IO3`引脚,用于接收芯片操作的中断响应输出指示,本工程该引脚未使用,用户可以配置中断映射功能
- 8. BOARD_GPIO_SPI_GPIOD -> 直连射频芯片的`busy`引脚,用于检测射频芯片工作状态是否忙状态,
- 9. 其他IO口未使用,可根据实际情况移植
+
 ### 无线应用开发注意事项
 #### 无线频率
-1. 避免使用中心频率为射频芯片使用的晶体频率整数倍的,比如晶体频率为32MHz,就需要避免使用`448MHz`的中心频点
+   
 #### 驱动调试
 1. 首先保证SPI通讯正常,具体SPI时序需根据射频芯片要求设置,可通过示波器或者逻辑分析仪进行硬件分析
 2. SPI通讯正常后,进一步调试查看寄存器操作,读写寄存器,若能正常操作,基本可判定移植成功了
+   
 #### 通讯距离
 影响无线传输距离的因素
 1. 无线电频谱,包括使用的无线频段和无线波特率
@@ -156,15 +93,11 @@ C99标准
 3. 天线增益,不同增益的天线对无线信号的接收效果影响很大
 4. 路径损耗,主要是包括无线使用的周围环境,比如楼宇、树木山峰遮挡
 5. 其他的无线信号干扰
+   
 ## 二十二、软件开发
 ### 开发注意事项
-* 休眠sleep
-    sleep有两种状态:params.Fields.WarmStart = 1;和params.Fields.WarmStart = 0;
-    `params.Fields.WarmStart = 1`:可以直接调用`Radio.Rx`和`Radio.Send`
-    `params.Fields.WarmStart = 0`:需要重新配置初始化才能调用`Radio.Rx`和`Radio.Send`
+
 ### 工程文件架构
-### 有源温补晶体
-1. 电压:3.3V。@SX126xSetDio3AsTcxoCtrl( TCXO_CTRL_3_3V, RADIO_TCXO_SETUP_TIME << 6 );
 ```c
 ..\adapterBoardDriver_xxxxxxxxxxxxxxx_Vxx
 ├──app \\常用应用模块封装
@@ -182,9 +115,9 @@ C99标准
 ├──project \\项目的主函数和GPIO定义包含文件
 |  └──
 ├──radio   \\射频底层驱动文件
-|  ├──myRadio_gpio.c  \\射频驱动接口硬件初始化
 |  └──myRadio.c   \\为无线应用通用封装API
 ```
+
 ### 无线应用通用封装API-radio/myRadio.c
 1. **初始化**-`void myRadio_init(int agr0, void *agr1_ptr)`
  	射频芯片驱动IO口初始化-`myRadio_gpio_init()`
@@ -204,11 +137,9 @@ C99标准
  	单载波发射功能,预留
  	进入direct模式,预留
  	连续调制波,预留
-13. **射频中断回调函数**`void myRadio_gpioCallback(uint8_t index)`
-    外部中断检测定义在`myRadio_gpio.c`
-14. 其他,官方未定义,属于第三方定义的常用API,不同厂家的射频方案不一定都能用
+13. 其他,官方未定义,属于第三方定义的常用API,不同厂家的射频方案不一定都能用
+    
 ### 版本更新
-#### V04
 
 ## 二十三、免责说明
 1、本工程驱动软件只提供做演示项目使用,未经过大批量项目验证,客户需谨慎使用,如果使用在正式项目中引发的所有问题,本司概不负责。使用过程若发现任何问题,可及时与本司相关人员联系。

+ 6 - 1
keil_v5/project.uvoptx

@@ -117,6 +117,11 @@
         <pMon>BIN\CMSIS_AGDI.dll</pMon>
       </DebugOpt>
       <TargetDriverDllRegistry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>DLGUARM</Key>
+          <Name></Name>
+        </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Key>JL2CM3</Key>
@@ -130,7 +135,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>CMSIS_AGDI</Key>
-          <Name>-X"Any" -UAny -O1230 -S9 -C0 -P00000000 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO31 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM)</Name>
+          <Name>-X"Any" -UAny -O2510 -S9 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO31 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM)</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>

+ 1 - 1
project/main.c

@@ -59,7 +59,7 @@ void rfRx_callback(uint8_t status, rfRxPacket_ts packet)
         case TX_STA_SECCESS:
         {
             myRadio_receiver();
-            rftxflag = true;
+            rftxflag = false;
         }
         break;
         default:

+ 1 - 103
radio/spi.c

@@ -55,33 +55,6 @@ void RF_SPI_NSS_L(void)
 void spi_init(void)
 {
     GPIO_InitTypeDef  GPIO_InitStructure;
-    
-#if defined(SPI_HARD)    
-    //----------SPI1时钟使能
-    RCC_APB2PeriphClockCmd(	RCC_APB2Periph_SPI1, ENABLE );
-
-	GPIO_InitStructure.GPIO_Pin = RF_SPI_SCK_IO | RF_SPI_MISO_IO | RF_SPI_MOSI_IO;
-	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
-	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-	GPIO_Init(RF_SPI_SCK_Port, &GPIO_InitStructure);
-
- 	GPIO_SetBits(RF_SPI_SCK_Port, RF_SPI_SCK_IO | RF_SPI_MISO_IO | RF_SPI_MOSI_IO);
-    /*!< SPI configuration */
-    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
-    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
-    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
-    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
-    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
-    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
-    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
-
-    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
-    SPI_InitStructure.SPI_CRCPolynomial = 7;
-    SPI_Init(SPI1, &SPI_InitStructure);
-
-    /*!< Enable the SPI1  */
-    SPI_Cmd(SPI1, ENABLE);
-#else
 
     GPIO_InitStructure.GPIO_Pin = RF_SPI_MOSI_IO;           
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
@@ -95,7 +68,7 @@ void spi_init(void)
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      
     GPIO_Init(RF_SPI_SCK_Port, &GPIO_InitStructure);
-#endif
+
     GPIO_InitStructure.GPIO_Pin = RF_SPI_NSS_IO;            
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      
@@ -104,59 +77,6 @@ void spi_init(void)
 
     RF_SPI_NSS_H();
 }
-uint8_t SpiReadWrite(uint8_t byteToWrite)
-{
-    uint8_t i, temp;
-    
-    temp = 0;   
-    __set_PRIMASK(1);   //全局中断关闭
-#if defined(SPI_HARD)
-	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
-    {
-        i++;
-        if(i > 200)return 0;
-    }			  
-	SPI_I2S_SendData(SPI1, byteToWrite); //通过外设SPIx发送一个数据
-	i=0;
-
-	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//检查指定的SPI标志位设置与否:接受缓存非空标志位
-    {
-        i++;
-        if(i > 200)return 0;
-    }
-    /*!< Return the byte read from the SPI bus */
-    temp = SPI_I2S_ReceiveData(SPI1);
-#else
-    RF_SPI_SCK_L();
-    for(i=0; i<8; i++)
-    {
-        if(byteToWrite & 0x80)
-        {
-          //SpiSetMosiHigh();
-          RF_SPI_MOSI_H();
-        }
-        else
-        {
-          //SpiSetMosiLow();
-          RF_SPI_MOSI_L();
-        } 
-
-        byteToWrite <<= 1;
-
-        //SpiSetSckHigh(); 
-        RF_SPI_SCK_H();
-        temp <<= 1;
-        if(READ_RF_SPI_MISO())
-        {
-          temp ++; 
-        }
-        //SpiSetSckLow();
-        RF_SPI_SCK_L();
-    }
-#endif
-    __set_PRIMASK(0);   //全局中断打开
-    return temp;
-}
 void SpiWrite(uint8_t byteToWrite)
 {
     uint8_t i;  
@@ -201,25 +121,3 @@ uint8_t SpiRead(void)
     return temp;
 }
 
-void SpiWriteData(uint8_t* pData, uint8_t byteCount)
-{
-  uint8_t i;
-  
-  for(i=0;i<byteCount;i++)
-  {
-    SpiReadWrite(*pData);
-    pData++;
-  }
-}
-
-void SpiReadData(uint8_t* pData, uint8_t byteCount)
-{
-  uint8_t i;
-  
-  for(i=0;i<byteCount;i++)
-  {
-    *pData=SpiReadWrite(0xff);
-    pData++;
-  }
-}
-

+ 0 - 3
radio/spi.h

@@ -24,10 +24,7 @@ void RF_SPI_NSS_H(void);
 void RF_SPI_NSS_L(void);
 
 void spi_init(void);
-extern uint8_t SpiReadWrite(uint8_t byteToWrite);
 void SpiWrite(uint8_t byteToWrite);
 uint8_t SpiRead(void);
-extern void SpiWriteData(uint8_t* pData, uint8_t byteCount);
-extern void SpiReadData(uint8_t* pData, uint8_t byteCount);
 
 #endif