基于SUN6200无线通信模块 C51示例程序 SDK开源代码解读
这段代码是一个用于演示如何使用SUN6200无线通信模块的示例程序。SUN6200无线通信模块采用HS6200 2.4G无线收发IC,HS6200是一款低功耗、高性能的无线通信芯片,广泛应用于无线传感器、智能家居、物联网等领域。主控芯片为NE76E003
资料下载
HS6200 2.4G无线射频IC 规格书Datasheet 应用手册 下载_资料下载_光明谷科技 (sunsili.com)
SUN6200 2.4G无线射频模块规格书
Github开源SUN6200-SDK
sun6200: SUN6200 2.4G无线模块 RF射频模块 低成本替代Si24R1 NRF24L01 SPI接口,采用昂瑞微 (原HUNTERS汉天下)HS6200 2.4G无线收发芯片工作于 2.400 - 2.4835GHz 的全球 ISM 频段。 此SDK不受平台限制,可适用于任何平台。 (https://gitee.com/lojam/sun6200)
以下是对代码的概括性总结和详细解析:
概括性总结
- 初始化: 程序开始时,初始化UART通信、LED指示灯,并配置HS6200模块。
- 主循环: 在主循环中,程序交替将HS6200设置为发送模式和接收模式。在发送模式下,发送一个固定的数据包;在接收模式下,等待接收数据,并将接收到的数据通过UART发送给PC。
- LED指示: 通过不同的LED指示当前HS6200的状态,例如发送数据时点亮测试LED,接收到数据时点亮绿色LED。
- 看门狗定时器: 程序中包含了配置看门狗定时器的代码,以防止程序卡死。
详细解析
定义和初始化:
- 定义了与HS6200通信所需的SPI接口的位操作宏,以及LED的指示宏。
初始化函数
led_init
用于设置LED的初始状态和模式。移植到基他平台,只需更改SPI IO口定义即可
看门狗定时器配置 (
Enable_WDT_Reset_Config
):该函数用于配置看门狗定时器,以防程序异常卡死。通过特定的序列操作,设置看门狗定时器的超时时间,并启用它。
主函数 (
main
):- 初始化UART和HS6200模块。
- 进入一个无限循环,循环中交替执行发送和接收操作。
- 在发送模式下,通过HS6200发送一个预定义的数据包。
- 在接收模式下,等待接收数据,接收到数据后通过UART输出到PC,并重新发送接收到的数据包。
- 使用LED指示当前的操作状态,如发送数据时点亮测试LED,接收到数据时点亮绿色LED。
循环中包含延时和看门狗定时器的清除操作,以防止看门狗超时。
调试信息:
- 程序中包含了一些调试信息的打印,例如初始化成功提示、接收到的数据等,这些信息通过UART发送到PC,便于调试和监控程序的运行状态。
注释和版权信息:
- 文件开始部分包含了版权声明、作者信息和版本历史,强调了代码的使用许可和来源。
sbit HS6200_CE = P1^0;
sbit HS6200_CS = P1^1;
sbit SPI_SCK = P1^2;
sbit SPI_MOSI = P1^3;
sbit SPI_MISO = P1^4; /*
* ___________________________ \ /
* | | _____________ |
* | | | | |
* | P1.0 | ---> | nCE |-----|
* | S | P1.2 | ---> | SCK | S | H
* | P | P1.4 | <--- | MISO| P | S
* | I | P1.3 | ---> | MOSI| I | 6 (as PRX&&PTX)
* | | P1.1 | ---> | nSS | | 2
* /-------------------- | VBUS NC | <--- | IRQ | 0
* P ____/RX________USB to_____ | TX | |_____________| 0
* C \RX UART | RX |
* \-------------------- | GND |
* | |
* | |
* | |
* | |
* | P1.6 | ---> SYSCLK Output,used for test.
* | |
* | |
* | P0.0 | ---> LED1 ( LED On when P2.2 output 0 )
* | P0.1 | ---> LED2 ( LED On when P2.3 output 0 )
* | |
* |___________________________|
*/
void led_init(void)
{
LED_RED = 0;
LED_GRN = 0;
LED_TEST = 0;
setGPIO_LED_RED_OUT();
setGPIO_LED_GRN_OUT();
setGPIO_LED_TEST_OUT();
LED_RED = 1;
LED_GRN = 1;
LED_TEST = 1;
}
/***********************************************************************
WDT CONFIG enable
warning : this macro is only when ICP not enable CONFIG WDT function
copy this marco code to you code to enable WDT reset.
************************************************************************/
void Enable_WDT_Reset_Config(void)
{
set_IAPEN;
IAPAL = 0x04;
IAPAH = 0x00;
IAPFD = 0x0F;
IAPCN = 0xE1;
set_CFUEN;
set_IAPGO; //trigger IAP
while((CHPCON&SET_BIT6)==SET_BIT6); //check IAPFF (CHPCON.6)
clr_CFUEN;
clr_IAPEN;
TA=0xAA;
TA=0x55;
WDCON=0x06; //Setting WDT prescale WDPS=0x07(111) div=256 WDTimeout:1.638s Info:datasheetPage118
set_WDCLR; //Clear WDT timer
while((WDCON|~SET_BIT6)==0xFF); //confirm WDT clear is ok before into power down mode
EA = 1;
set_WDTR; //WDT run
}
void main(void)
{
uint32_t cnt;
uint8_t i, recvLen;
#ifdef USE_SOFT_SPI
soft_spi_init();
#endif
InitialUART0_Timer1(9600); //UART0 Baudrate from Timer1
printf ("*=======================================*\n");
printf ("* * Name: HS6200 SDK Sample Code. *\n");
printf ("* * (C) Sunshine Silicon Corporation *\n");
printf ("* * Website: http://www.sunsili.com *\n");
printf ("* * E-Mail : fan@sunsili.com *\n");
printf ("*========================================*\n");
printf ("* HS6200 receive data and uart transmit the same data to PC .*\n");
led_init();
// Enable_WDT_Reset_Config();
printf("HS6200 init .... \n");
HS6200_Init();
printf("HS6200 Init Sucesss! \n");
LED_RED = 0;
for( ; ;)
{
HS6200_ModeSwitch(Rf_PTX_Mode);
HS6200_Clear_All_Irq();
HS6200_Flush_Tx();
HS6200_SendPack(HS6200_W_TX_PAYLOAD , TXBuffer, 2);
LED_TEST_ON();
Delay_ms(10);
HS6200_ModeSwitch(Rf_PRX_Mode);
HS6200_Clear_All_Irq();
HS6200_Flush_Rx();
LED_GRN_OFF();
cnt = 1;
while(cnt++<100)
{
Delay_ms(1);
recvLen = HS6200_RecivePack(rx_buf);
if( recvLen )
{
HS6200_Clear_All_Irq();
HS6200_Flush_Rx();
HS6200_ModeSwitch(Rf_PTX_Mode);
HS6200_Clear_All_Irq();
HS6200_Flush_Tx();
HS6200_SendPack(HS6200_W_TX_PAYLOAD , rx_buf, recvLen);
// APP_LOG_DEBUG("HS6200 Recv \n");
printf("HS6200 Recv: ");
for(i=0; i<recvLen; i++)
{
// Send_Data_To_UART0(rx_buf[i]);
printf("%x ", (int)rx_buf[i]);
}
printf("\n");
break;
}
}
// Send_Data_To_UART0(cnt);
printf("Cnt: %d \n", (int)cnt);
if( recvLen )
{
LED_GRN_ON();
}
LED_TEST_OFF();
Delay_ms(100);
set_WDCLR; //Clear WDT timer
}
}
SDK代码是STM8Sxxx/51单片机/PIC单片机等完整的示例,展示了如何使用SUN6200模块进行基本的无线通信操作,包括数据的发送和接收,以及如何通过LED指示不同的工作状态。通过这个示例,开发者可以快速了解SUN6200模块的基本使用方法,以及如何在自己的项目中集成和使用SUN6200模块