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单片机源程序(主程序)如下:
- /**
- ******************************************************************************
- * @author 泽耀科技 ASHINING
- * @version V3.0
- * @date 10-08
- * @brief 主函数C文件
- ******************************************************************************
- * @attention
- ******************************************************************************
- */
- #include "main.h" //main.h 中含有TX/RX、软件SPI/硬件SPI选择配置选项
- const char *g_Ashining = "ashining";
- uint8_t g_TxMode = 0, g_UartRxFlag = 0;
- uint8_t g_UartRxBuffer[ 64 ] = { 0 };
- uint8_t g_SI4463ItStatus[ 9 ] = { 0 };
- uint8_t g_SI4463RxBuffer[ 64 ] = { 0 };
- /**
- * @brief :主函数
- * @param :无
- * @note :无
- * @retval:无
- */
- int main( void )
- {
- uint16_t i = 0;
- //串口初始化波特率 9600
- drv_uart_init( 9600 );
-
- //延时初始化
- drv_delay_init( );
-
- //LED初始化
- drv_led_init( );
-
- //SPI初始化
- drv_spi_init( );
-
- //SI4463初始化
- SI446x_Init( );
-
- led_red_off( );
- led_green_off( );
- for( i = 0; i < 6; i++ ) //模块初始化完成,LED灯闪烁3个周期
- {
- led_red_flashing( );
- led_green_flashing( );
- drv_delay_500Ms( 1 );
- }
-
-
- #ifdef __SI4438_TX_TEST__
- //=========================================================================================//
- //*****************************************************************************************//
- //************************************* 发送 **********************************************//
- //*****************************************************************************************//
- //=========================================================================================//
-
- //按键初始化
- drv_button_init( ); //Demo程序中 只有在发送时才会使用按键
-
- while( 1 )
- {
- //模式切换
- if( BUTOTN_PRESS_DOWN == drv_button_check( )) //检查按键动作
- {
- g_TxMode = 1 - g_TxMode; //模式会在 TX_MODE_1( 0 ),TX_MODE_2( 1 )之间切换
-
- //状态显示清零
- led_green_off( );
- led_red_off( );
-
- if( TX_MODE_1 == g_TxMode )
- {
- for( i = 0; i < 6; i++ ) //固定发送模式,红灯闪烁3次
- {
- led_red_flashing( );
- drv_delay_500Ms( 1 );
- }
- }
- else
- {
- for( i = 0; i < 6; i++ ) //串口发送模式,绿灯闪烁3次
- {
- led_green_flashing( );
- drv_delay_500Ms( 1 );
- }
- }
- }
-
- //发送固定字符串
- if( TX_MODE_1 == g_TxMode )
- {
- //发送数据
- #if PACKET_LENGTH == 0
- SI446x_Send_Packet( (uint8_t *)g_Ashining, 8, 0, 0 );
- #else
- SI446x_Send_Packet( (uint8_t *)g_Ashining, PACKET_LENGTH, 0, 0 );
- #endif
- drv_delay_500Ms( 1 );
- led_red_flashing( ); //1S左右发送一包 每发送一包红灯闪烁一次
- drv_delay_500Ms( 1 );
- }
- else //发送串口接收到的字符串
- {
- //查询串口数据
- i = drv_uart_rx_bytes( g_UartRxBuffer );
-
- if( 0 != i )
- {
- if( 16 < i )
- {
- i = 0;
- }
- #if PACKET_LENGTH == 0
- SI446x_Send_Packet( (uint8_t *)g_UartRxBuffer, i, 0, 0 );
- #else
- SI446x_Send_Packet( (uint8_t *)g_UartRxBuffer, PACKET_LENGTH, 0, 0 );
- #endif
- led_red_flashing( );
- }
- }
- }
-
- #else
- //=========================================================================================//
- //*****************************************************************************************//
- //************************************* 接收 **********************************************//
- //*****************************************************************************************//
- //=========================================================================================//
-
- while( 1 )
- {
- SI446x_Interrupt_Status( g_SI4463ItStatus ); //读中断状态
-
- if( g_SI4463ItStatus[ 3 ] & ( 0x01 << 4 ))
- {
- i = SI446x_Read_Packet( g_SI4463RxBuffer ); //读FIFO数据
- if( i != 0 )
- {
- led_green_flashing( );
- drv_uart_tx_bytes( g_SI4463RxBuffer,i ); //输出接收到的字节
- }
-
- SI446x_Change_Status( 6 );
- while( 6 != SI446x_Get_Device_Status( ));
- SI446x_Start_Rx( 0, 0, PACKET_LENGTH,0,0,3 );
- }
- else
- {
- if( 3000 == i++ )
- {
- i = 0;
- SI446x_Init( );
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载(完整代码+说明):
Demo_SI4438_Stm32F103.zip
(764.69 KB, 下载次数: 227)
|