找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10936|回复: 15
打印 上一主题 下一主题
收起左侧

SI4438的串口收发STM32例程

  [复制链接]
跳转到指定楼层
楼主
ID:234114 发表于 2017-9-19 14:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SI4438 Demo 程序说明文档
工程说明:
    1、Demo 工程是基于Stm32F103 单片机在MDK(KEIL5)平台下对SI4438 无线模块的开发例程,用户可在此基础上加强对SI4438的理解,也可在此基础上进行移植以便对SI4438 模块进行2 次开发。
    2、Demo 工程主要实现两个功能 (TX/RX ):
       一、发送功能:模块配置为发送功能,在发送模式 1,每秒发送一次固定字符串 “ashining”;在发送模式2,通过串口发送自定义数据(如www.51hei.com )。发送模式1 和发送模式2 通过按键切换。
       二、接收功能:模块配置为接收功能,接收数据并通过串口将接收到的数据输出, 串口波特率默认配置为9600。
    3、Demo 程序提供了硬件SPI 接口和软件模拟SPI 接口(基于C52 的Demo 程序只有软件模拟SPI 接口),用户在移植时可根据不同的PCB 布局和实际应用需求进行选择。
    4、Demo 程序开始运行时,两个LED 灯会闪烁3 个周期(一亮一灭为一个周期),代表无线模块已经初始化完成处于发送状态或接收状态。如果上电两个LED 没有正常闪烁,说明无线模块初始化失败或未检测到无线模块,建议断电重新插拔芯片再上电。

工程配置:
    1、发送功能和接收功能的选择切换:Demo  工程只需经过简单的配置修改就可以在发
       送功能和接收功能之间进行切换,采用这种编写方式的目的是为了让用户更加容易
       理解SI4438 无线模块发送和接收功能的操作方式到底有何不同,让用户更容易掌握
       对无线模块的操作并进行2 次开发。
       发送和接收功能切换方法(以从默认的发送功能切换到接收功能为例):解压Demo
       工程压缩包,在Demo_SI4438_Stm32F103\Project_SI4438\Source_Files\app\inc 文件
       夹下打开main.h 头文件(或者通过开发软件打开工程找到main.h),该头文件在包
       含其他相关头文件后,便是关于工程配置的宏定义,第一个宏定义为发送功能和接
       收功能选择切换使用的宏定义。第一个宏定义为#define __SI4438_TX_TEST__,保留
       该宏定义工程就被配置成发送功能(默认工程配置为发送功能,即保留了该宏定义),
       通过屏蔽该宏定义(在#define          前加“//”),可将工程由默认的发送功能配置成接收
       功能。

    2、硬件SPI 接口和软件模拟SPI 接口的选择切换:为了使Demo 程序适应性更强,可
       移植性更高,Demo 程序提供了硬件SPI 接口和软件模拟SPI 接口可供用户选择。程
       序默认配置为硬件SPI 接口 (部分单片机无硬件SPI 接口如C52 单片机,这种情况
       下只有软件模拟SPI 接口,固不存在SPI 接口的切换)。
       硬件SPI 接口和软件模拟SPI 接口的切换方法:切换方法同发送、接收功能的切换
       方法一致,main.h 中第二个宏定义为#define __USE_SOFT_SPI_INTERFACE,屏蔽该宏
       定义为选择硬件SPI 接口(工程默认配置为选择硬件SPI 接口),保留该宏定义为选
       择软件模拟SPI 接口。

       注:在修改工程配置后,需要重新编译再下载修改才会起效。
           SI4463 和SI4438 程序除了配置头文件不一样,其他一样。

开发环境:
      1、优化选项选择默认值,即不做修改。
      2、编辑环境设置(适用于Demo 程序V3.0 版Keil 平台):
         Edit -> Configuration  目录下:
              Editor -> Tab size 推荐设置为4,有利于工程中代码和注释的对齐。
              Enconding 推荐设置为 UTF-8 的编码格式,兼容性较好,不易出现乱码。

stm32单片机源程序(主程序)如下:
  1. /**
  2.   ******************************************************************************
  3.   * @author  泽耀科技 ASHINING
  4.   * @version V3.0
  5.   * @date    10-08
  6.   * @brief   主函数C文件
  7.   ******************************************************************************
  8.   * @attention
  9.   ******************************************************************************
  10.   */

  11. #include "main.h"                                //main.h 中含有TX/RX、软件SPI/硬件SPI选择配置选项


  12. const char *g_Ashining = "ashining";
  13. uint8_t g_TxMode = 0, g_UartRxFlag = 0;
  14. uint8_t g_UartRxBuffer[ 64 ] = { 0 };
  15. uint8_t g_SI4463ItStatus[ 9 ] = { 0 };
  16. uint8_t g_SI4463RxBuffer[ 64 ] = { 0 };



  17. /**
  18.   * @brief :主函数
  19.   * @param :无
  20.   * @note  :无
  21.   * @retval:无
  22.   */
  23. int main( void )
  24. {        
  25.         uint16_t i = 0;

  26.         //串口初始化波特率 9600
  27.         drv_uart_init( 9600 );
  28.         
  29.         //延时初始化
  30.         drv_delay_init( );
  31.         
  32.         //LED初始化
  33.         drv_led_init( );
  34.         
  35.         //SPI初始化
  36.         drv_spi_init( );
  37.         
  38.         //SI4463初始化        
  39.         SI446x_Init( );
  40.         
  41.         led_red_off( );
  42.         led_green_off( );
  43.         for( i = 0; i < 6; i++ )                //模块初始化完成,LED灯闪烁3个周期
  44.         {
  45.                 led_red_flashing( );
  46.                 led_green_flashing( );
  47.                 drv_delay_500Ms( 1 );
  48.         }
  49.                
  50.         
  51. #ifdef        __SI4438_TX_TEST__               
  52. //=========================================================================================//        
  53. //*****************************************************************************************//
  54. //************************************* 发送 **********************************************//
  55. //*****************************************************************************************//
  56. //=========================================================================================//        
  57.         
  58.         //按键初始化
  59.         drv_button_init( );                                //Demo程序中 只有在发送时才会使用按键
  60.         
  61.         while( 1 )        
  62.         {
  63.                 //模式切换
  64.                 if( BUTOTN_PRESS_DOWN == drv_button_check( ))        //检查按键动作
  65.                 {
  66.                         g_TxMode = 1 - g_TxMode;                //模式会在 TX_MODE_1( 0 ),TX_MODE_2( 1 )之间切换
  67.                         
  68.                         //状态显示清零
  69.                         led_green_off( );
  70.                         led_red_off( );
  71.                         
  72.                         if( TX_MODE_1 == g_TxMode )
  73.                         {
  74.                                 for( i = 0; i < 6; i++ )                //固定发送模式,红灯闪烁3次
  75.                                 {
  76.                                         led_red_flashing( );        
  77.                                         drv_delay_500Ms( 1 );               
  78.                                 }
  79.                         }
  80.                         else
  81.                         {
  82.                                 for( i = 0; i < 6; i++ )                //串口发送模式,绿灯闪烁3次
  83.                                 {
  84.                                         led_green_flashing( );        
  85.                                         drv_delay_500Ms( 1 );
  86.                                 }
  87.                         }
  88.                 }
  89.                
  90.                 //发送固定字符串
  91.                 if( TX_MODE_1 == g_TxMode )
  92.                 {
  93.                         //发送数据
  94.                         #if PACKET_LENGTH == 0
  95.                                 SI446x_Send_Packet( (uint8_t *)g_Ashining, 8, 0, 0 );
  96.                         #else
  97.                                 SI446x_Send_Packet( (uint8_t *)g_Ashining, PACKET_LENGTH, 0, 0 );
  98.                         #endif
  99.                         drv_delay_500Ms( 1 );        
  100.                         led_red_flashing( );                        //1S左右发送一包 每发送一包红灯闪烁一次
  101.                         drv_delay_500Ms( 1 );        
  102.                 }
  103.                 else        //发送串口接收到的字符串
  104.                 {        
  105.                         //查询串口数据
  106.                         i = drv_uart_rx_bytes( g_UartRxBuffer );
  107.                         
  108.                         if( 0 != i )
  109.                         {
  110.                                 if( 16 < i )
  111.                                 {
  112.                                         i = 0;
  113.                                 }
  114.                                 #if PACKET_LENGTH == 0
  115.                                         SI446x_Send_Packet( (uint8_t *)g_UartRxBuffer, i, 0, 0 );
  116.                                 #else
  117.                                         SI446x_Send_Packet( (uint8_t *)g_UartRxBuffer, PACKET_LENGTH, 0, 0 );
  118.                                 #endif
  119.                                 led_red_flashing( );
  120.                         }
  121.                 }
  122.         }
  123.         
  124. #else               
  125. //=========================================================================================//        
  126. //*****************************************************************************************//
  127. //************************************* 接收 **********************************************//
  128. //*****************************************************************************************//
  129. //=========================================================================================//        
  130.         
  131.         while( 1 )
  132.         {
  133.                 SI446x_Interrupt_Status( g_SI4463ItStatus );                //读中断状态
  134.                
  135.                 if( g_SI4463ItStatus[ 3 ] & ( 0x01 << 4 ))
  136.         {
  137.                         i = SI446x_Read_Packet( g_SI4463RxBuffer );                //读FIFO数据
  138.                         if( i != 0 )
  139.                         {
  140.                                 led_green_flashing( );
  141.                                 drv_uart_tx_bytes( g_SI4463RxBuffer,i );        //输出接收到的字节
  142.                         }
  143.                
  144.                         SI446x_Change_Status( 6 );
  145.                         while( 6 != SI446x_Get_Device_Status( ));
  146.                         SI446x_Start_Rx(  0, 0, PACKET_LENGTH,0,0,3 );
  147.                 }
  148.                 else
  149.                 {
  150.                         if( 3000 == i++ )
  151.                         {
  152.                                 i = 0;
  153.                                 SI446x_Init( );
  154. ……………………
  155. …………限于本文篇幅 余下代码请从51黑下载附件…………

复制代码

所有资料51hei提供下载(完整代码+说明):
Demo_SI4438_Stm32F103.zip (764.69 KB, 下载次数: 227)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:225634 发表于 2018-3-15 19:01 | 只看该作者
谢谢楼主!
回复

使用道具 举报

板凳
ID:373 发表于 2018-4-17 18:19 | 只看该作者
学习下,还没有用过这款发射芯片
回复

使用道具 举报

地板
ID:283462 发表于 2018-5-25 14:15 | 只看该作者
正需要,正好学习一下
回复

使用道具 举报

5#
ID:372320 发表于 2018-7-16 09:58 | 只看该作者
谢谢楼主,正是我需要的
回复

使用道具 举报

6#
ID:388156 发表于 2018-8-20 15:10 | 只看该作者
没分啊,有没有分享一下

评分

参与人数 1黑币 +10 收起 理由
春风十里吹 + 10 打偿你10分吧

查看全部评分

回复

使用道具 举报

7#
ID:94371 发表于 2018-8-20 23:53 | 只看该作者
正在找,不错, 3q.
回复

使用道具 举报

8#
ID:359322 发表于 2018-11-12 09:49 | 只看该作者
下载了    正在移植到8位机   到时把代码也共享出来
回复

使用道具 举报

9#
ID:471097 发表于 2019-1-21 11:15 | 只看该作者
发送模式2,一次最长可以发送多少个字节
回复

使用道具 举报

10#
ID:260557 发表于 2019-1-22 10:48 | 只看该作者
谢谢楼主!
回复

使用道具 举报

11#
ID:10007 发表于 2019-7-25 22:27 | 只看该作者
正需要,正好学习一下
回复

使用道具 举报

12#
ID:578662 发表于 2019-11-16 14:25 | 只看该作者
  有没有 同志,分享一下?没分。。
回复

使用道具 举报

13#
ID:960912 发表于 2021-8-17 13:55 | 只看该作者
有没有哪位能送一点分的,签到攒够一定记得还,谢谢!
回复

使用道具 举报

14#
ID:323456 发表于 2023-3-4 17:25 | 只看该作者
十分感谢,全网都没找到几篇关于4438的,如果我最后学会了,一定记你一功(开个玩笑)
回复

使用道具 举报

15#
ID:323456 发表于 2023-3-4 17:29 | 只看该作者
如果学会了记你一功
回复

使用道具 举报

16#
ID:1109212 发表于 2024-1-24 09:26 | 只看该作者
发送不需要切换到发送模式嘛?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表