标题:
SI4438的串口收发STM32例程
[打印本页]
作者:
笨鸟想飞
时间:
2017-9-19 14:47
标题:
SI4438的串口收发STM32例程
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, 下载次数: 233)
2017-9-19 14:47 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
Paul1960
时间:
2018-3-15 19:01
谢谢楼主!
作者:
chengfgc
时间:
2018-4-17 18:19
学习下,还没有用过这款发射芯片
作者:
zsk_mcu
时间:
2018-5-25 14:15
正需要,正好学习一下
作者:
星星知我心
时间:
2018-7-16 09:58
谢谢楼主,正是我需要的
作者:
idolpupil
时间:
2018-8-20 15:10
没分啊,有没有分享一下
作者:
musich
时间:
2018-8-20 23:53
正在找,不错, 3q.
作者:
swiky
时间:
2018-11-12 09:49
下载了 正在移植到8位机 到时把代码也共享出来
作者:
zhouhonghong
时间:
2019-1-21 11:15
发送模式2,一次最长可以发送多少个字节
作者:
fmqwh626
时间:
2019-1-22 10:48
谢谢楼主!
作者:
kevin209
时间:
2019-7-25 22:27
正需要,正好学习一下
作者:
起风了111
时间:
2019-11-16 14:25
有没有 同志,分享一下?没分。。
作者:
lllttt
时间:
2021-8-17 13:55
有没有哪位能送一点分的,签到攒够一定记得还,谢谢!
作者:
bo0501
时间:
2023-3-4 17:25
十分感谢,全网都没找到几篇关于4438的,如果我最后学会了,一定记你一功(开个玩笑)
作者:
bo0501
时间:
2023-3-4 17:29
如果学会了记你一功
作者:
Lcw97910
时间:
2024-1-24 09:26
发送不需要切换到发送模式嘛?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1