找回密码
 立即注册

QQ登录

只需一步,快速开始

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

SI4438 STM8L101收发源程序与说明资料下载

[复制链接]
跳转到指定楼层
楼主
SI4438_STM8 Demo 程序说明文档
工程说明
1、 Demo 工程是基于 Stm8L101 单片机在 STVD 平台下对 SI4438 无线模块的开发例程,用户可在此基础上加强对 SI4438 的理解,也可在此基础上进行移植以便对 SI4438模块进行2 次开发。
2、 Demo工程主要实现两个功能(TX/RX) :
一、发送功能:模块配置为发送功能,在发送模式 1,每秒发送一次固定字符串
“ashining”;在发送模式2,通过串口发送自定义数据 。
发送模式1 和发送模式2通过按键切换。
二、接收功能:模块配置为接收功能,接收数据并通过串口将接收到的数据输出,串口波特率默认配置为9600。
3、 Demo程序提供了硬件 SPI接口和软件模拟 SPI接口 (基于C52 的Demo程序只有软件模拟SPI 接口),用户在移植时可根据不同的PCB布局和实际应用需求进行选择。
4、 Demo程序开始运行时,两个LED灯会闪烁3个周期(一亮一灭为一个周期) ,代表无线模块已经初始化完成处于发送状态或接收状态。如果上电两个 LED没有正常闪烁,说明无线模块初始化失败或未检测到无线模块, 建议断电重新插拔芯片再上电。  
工程配置:
1、 发送功能和接收功能的选择切换:Demo 工程只需经过简单的配置修改就可以在发送功能和接收功能之间进行切换,采用这种编写方式的目的是为了让用户更加容易理解SI4438 无线模块发送和接收功能的操作方式到底有何不同, 让用户更容易掌握对无线模块的操作并进行2 次开发。 发送和接收功能切换方法(以从默认的发送功能切换到接收功能为例) :解压Demo工程压缩包, 在Demo_SI4438_Stm8L101\Project_SI4438\Source_Files\app\inc文件夹下打开main.h 头文件(或者通过开发软件打开工程找到 main.h) ,该头文件在包含其他相关头文件后,便是关于工程配置的宏定义,第一个宏定义为发送功能和接收功能选择切换使用的宏定义。第一个宏定义为#define __SI4438_TX_TEST__,保留该宏定义工程就被配置成发送功能 (默认工程配置为发送功能,即保留了该宏定义) ,通过屏蔽该宏定义(在  #define  前加“//”),可将工程由默认的发送功能配置成接收功能。
2、 硬件 SPI 接口和软件模拟 SPI 接口的切换方法:切换方法同发送、接收功能的切换方法一致,main.h中第二个宏定义为#define __USE_SOFT_SPI_INTERFACE,屏蔽该宏定义为选择硬件 SPI接口(工程默认配置为选择硬件SPI接口) ,保留该宏定义为选择软件模拟 SPI接口。   

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

开发环境:
        1、优化选项选择默认值,即不做不修改。
2、Editor -> Tab size  推荐设置为4,有利于工程中代码和注释的对齐。

stm8l101 收发程序,26M晶振。

单片机源程序如下:
  1. /**
  2.   ******************************************************************************
  3.   * @author  泽耀科技 ASHINING
  4.   * @version V3.0
  5.   * @date    2016-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.         //LED初始化
  30.         drv_led_init( );
  31.        
  32.         //SPI初始化
  33.         drv_spi_init( );
  34.        
  35.         //SI4463初始化
  36.         SI446x_Init( );
  37.        
  38.         led_red_off( );                                        //默认LED灯全为灭
  39.         led_green_off( );
  40.         for( i = 0; i < 6; i++ )                //SI4463初始化完成,两个LED同时闪烁3个周期
  41.         {
  42.                 led_red_flashing( );
  43.                 led_green_flashing( );
  44.                 drv_delay_ms( 500 );
  45.         }
  46.                
  47.        
  48. #ifdef        __SI4438_TX_TEST__               
  49. //=========================================================================================//       
  50. //*****************************************************************************************//
  51. //************************************* 发送 **********************************************//
  52. //*****************************************************************************************//
  53. //=========================================================================================//       
  54.        
  55.         //按键初始化
  56.         drv_button_init( );                                //Demo程序中,只有在发送时才会使用按键
  57.        
  58.         while( 1 )       
  59.         {
  60.                 //模式切换
  61.                 //Demo程序默认为发送模式1,即发送固定字符串“ashining”,可以通过按键切换到发送模式2,即通过串口发送数据,按键的作用就是切换发送模式1 2
  62.                 //如果在程序移植过程中不需要两种发送模式,删除下面 if 语句程序块和按键初始化程序即可

  63.                 if( BUTOTN_PRESS_DOWN == drv_button_check( ))        //检测按键动作
  64.                 {
  65.                         g_TxMode = 1 - g_TxMode;                //在TX_MODE_1( 0 ),TX_MODE_2( 1 )之间切换
  66.                        
  67.                         //清LED状态
  68.                         led_green_off( );
  69.                         led_red_off( );
  70.                        
  71.                         if( TX_MODE_1 == g_TxMode )
  72.                         {
  73.                                 for( i = 0; i < 6; i++ )                //切换到模式1 发送固定“ashining”固定字符串
  74.                                 {
  75.                                         led_red_flashing( );       
  76.                                         drv_delay_ms( 500 );               
  77.                                 }
  78.                         }
  79.                         else
  80.                         {
  81.                                 for( i = 0; i < 6; i++ )                //切换到模式2 通过串口发送数据
  82.                                 {
  83.                                         led_green_flashing( );       
  84.                                         drv_delay_ms( 500 );
  85.                                 }
  86.                         }
  87.                 }
  88.                
  89.                 //如果在程序移植过程中不需要两种发送模式,删除上面 if 语句程序块和按键初始化程序即可
  90.                 //模式切换
  91.                

  92.                 //模式1 1S发送“ashining”一次
  93.                 if( TX_MODE_1 == g_TxMode )
  94.                 {
  95.                         //动态数据长度
  96.                         #if PACKET_LENGTH == 0
  97.                                 SI446x_Send_Packet( (uint8_t *)g_Ashining, 8, 0, 0 );
  98.                         #else
  99.                                 SI446x_Send_Packet( (uint8_t *)g_Ashining, PACKET_LENGTH, 0, 0 );
  100.                         #endif
  101.                         drv_delay_ms( 1000 );       
  102.                         led_red_flashing( );                        //1S发送一次
  103.                 }
  104.                 else        //模式2 外部通过串口发送数据到单片机,单片机通过SI4463将数据发送出去
  105.                 {       
  106.                         //轮训接收串口数据
  107.                         i = drv_uart_rx_bytes( g_UartRxBuffer );
  108.                        
  109.                         if( 0 != i )
  110.                         {
  111.                                 if( 17 < i )
  112.                                 {
  113.                                         i = 0;                //一次不超过17个字节
  114.                                 }
  115.                                 #if PACKET_LENGTH == 0
  116.                                         SI446x_Send_Packet( (uint8_t *)g_UartRxBuffer, i, 0, 0 );
  117.                                 #else
  118.                                         SI446x_Send_Packet( (uint8_t *)g_UartRxBuffer, PACKET_LENGTH, 0, 0 );
  119.                                 #endif
  120.                                 led_red_flashing( );
  121.                         }
  122.                 }
  123.         }
  124.        
  125. #else               
  126. //=========================================================================================//       
  127. //*****************************************************************************************//
  128. //************************************* 接收 **********************************************//
  129. //*****************************************************************************************//
  130. //=========================================================================================//       
  131.        
  132.         while( 1 )
  133.         {
  134.                 SI446x_Interrupt_Status( g_SI4463ItStatus );                //查询中断状态
  135.                
  136.                 if( g_SI4463ItStatus[ 3 ] & ( 0x01 << 4 ))
  137.         {
  138.                         i = SI446x_Read_Packet( g_SI4463RxBuffer );                //读接收到的数据
  139.                         if( i != 0 )
  140.                         {
  141.                                 led_green_flashing( );
  142.                                 drv_uart_tx_bytes( g_SI4463RxBuffer,i );        //串口输出SI4463接收到的数据
  143.                         }
  144.                
  145.                         SI446x_Change_Status( 6 );
  146.                         while( 6 != SI446x_Get_Device_Status( ));
  147.                         SI446x_Start_Rx(  0, 0, PACKET_LENGTH,0,0,3 );
  148. ……………………

  149. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
Demo_SI4438_Stm8L101.zip (699.33 KB, 下载次数: 104)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:586493 发表于 2019-7-18 17:13 | 只看该作者
下载来看看
回复

使用道具 举报

板凳
ID:206350 发表于 2021-4-20 22:32 | 只看该作者
为楼主点赞,支持分享~~~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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