找回密码
 立即注册

QQ登录

只需一步,快速开始

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

SI4438 Directional硬件SPI STM8S105单片机IAR代码分享

[复制链接]
跳转到指定楼层
楼主
ID:191308 发表于 2018-11-23 19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


单片机源程序如下:
  1. #include "stm8s.h"
  2. #include "data_base.h"
  3. #include "radio.h"
  4. #include "si446x_cmd.h"
  5. #include "gpio.h"
  6. #include "delay.h"
  7. #include "user.h"

  8.    
  9. uint8_t bRadio_Process();

  10. U8   bMain_IT_Status;
  11. uint8_t RFstate;


  12. extern uint8_t tx_data[];
  13. extern  volatile uint16_t  tick_timer;

  14. #define EnableMaster   0

  15. /*
  16. Demo程序流程:Master   EnableMaster=1,发送tx_data数据包后等待接收端ack数据包,若500ms后未接收到ack数据包超时处理,若接收到ack数据包LED闪烁指示
  17.               Slaver   EnableMaster=0,接收到tx_data数据包后发送ack数据包,发送完成后LED灯闪烁指示

  18. */

  19. void main(void)
  20. {
  21.   vInitializeHW();// Initialize the Hardware and Radio

  22. #if   EnableMaster
  23.    RFstate=RFLR_STATE_TX_INIT;
  24. #else   
  25.    RFstate=RFLR_STATE_RX_INIT;
  26. #endif
  27. while(1)
  28. {
  29.     bRadio_Process();
  30. }
  31. }


  32. uint8_t bRadio_Process()
  33. {
  34. switch(RFstate)
  35. {
  36.    case RFLR_STATE_RX_INIT://接收初始化
  37.    
  38.    GPIO_WriteLow(SI4463_TX_PORT,SI4463_TX_IO);
  39.    GPIO_WriteHigh(SI4463_RX_PORT,SI4463_RX_IO);//开关切换到接收通路
  40.    vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber, 0);
  41.    tick_timer=0;
  42.    RFstate=RFLR_STATE_RX_RUNNING;
  43.    break;
  44.    
  45.    case RFLR_STATE_RX_RUNNING://接收处理
  46.      bMain_IT_Status = bRadio_Check_Tx_RX();
  47.      if(bMain_IT_Status==SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT)
  48.      {
  49.        if(EnableMaster)
  50.        {
  51.         RFstate=RFLR_STATE_RX_ACK_DONE;
  52.        }
  53.        else
  54.        {
  55.          RFstate=RFLR_STATE_RX_DONE;
  56.        }
  57.      }
  58.      if(tick_timer>500)
  59.      {
  60.       RFstate=RFLR_STATE_RX_TIMEOUT;
  61.      }
  62.      
  63.    break;
  64.    
  65.    case RFLR_STATE_TX_INIT://发射客户数据包初始化
  66.      GPIO_WriteHigh(SI4463_TX_PORT,SI4463_TX_IO);
  67.      GPIO_WriteLow(SI4463_RX_PORT,SI4463_RX_IO);//开关切换到发送通路
  68.      gSampleCode_SendVariablePacket();//打包发送客户数据包
  69.      tick_timer=0;
  70.      RFstate=RFLR_STATE_TX_RUNNING;
  71.    break;
  72.    
  73.    
  74.    case RFLR_STATE_TX_ACK_INIT://发射ack数据包初始化
  75.      GPIO_WriteHigh(SI4463_TX_PORT,SI4463_TX_IO);
  76.      GPIO_WriteLow(SI4463_RX_PORT,SI4463_RX_IO);//开关切换到发送通路
  77.      vSampleCode_SendAcknowledge();//打包发送ACK数据包
  78.      tick_timer=0;
  79.      RFstate=RFLR_STATE_TX_RUNNING;
  80.    break;
  81.    
  82.    
  83.    case RFLR_STATE_TX_RUNNING://发射处理
  84.      bMain_IT_Status = bRadio_Check_Tx_RX();
  85.      if(bMain_IT_Status==SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT)
  86.      {
  87.        if(EnableMaster)
  88.        {
  89.         RFstate=RFLR_STATE_TX_DONE;
  90.        }
  91.        else
  92.        {
  93.         RFstate=RFLR_STATE_TX_ACK_DONE;
  94.        }
  95.      }
  96.      if(tick_timer>500)
  97.      {
  98.       RFstate=RFLR_STATE_TX_TIMEOUT;
  99.      }
  100.    break;
  101.      
  102.    
  103.    case RFLR_STATE_RX_DONE://接收客户数据包完成
  104.      
  105.        if(gSampleCode_StringCompare(customRadioPacket, tx_data,20)==TRUE)
  106.        {
  107.         RFstate=RFLR_STATE_TX_ACK_INIT;//收到正确数据包后发射ack数据包
  108.        }
  109.        else
  110.        {
  111.          RFstate=RFLR_STATE_RX_INIT;
  112.        }
  113.    break;
  114.    
  115.    case RFLR_STATE_RX_ACK_DONE://接收ack数据包完成
  116.       
  117.        if(gSampleCode_StringCompare(customRadioPacket, "ACK",3)==TRUE)
  118.        {
  119.           GPIO_WriteLow(RF_LED1_PORT,RF_LED1_IO);//LED指示灯闪烁
  120.           m928_delay(20);
  121.           GPIO_WriteHigh(RF_LED1_PORT,RF_LED1_IO);
  122.         }
  123.         
  124.         m928_delay(100);
  125.         RFstate=RFLR_STATE_TX_INIT;
  126.    break;
  127.       
  128.    case RFLR_STATE_TX_DONE://发射完客户数据包
  129.      
  130.       RFstate=RFLR_STATE_RX_INIT;
  131.    break;
  132.    
  133.    case RFLR_STATE_TX_ACK_DONE://发射完ack数据包
  134.      
  135.         GPIO_WriteLow(RF_LED1_PORT,RF_LED1_IO);//LED灯闪烁
  136.         m928_delay(20);
  137.         GPIO_WriteHigh(RF_LED1_PORT,RF_LED1_IO);
  138.         
  139.         RFstate=RFLR_STATE_RX_INIT;
  140.       
  141.    break;
  142.    
  143.    case RFLR_STATE_TX_TIMEOUT://发射超时
  144.      
  145.        if(EnableMaster)
  146.        {
  147.         RFstate=RFLR_STATE_TX_INIT;
  148.        }
  149.        else
  150.        {
  151.         RFstate=RFLR_STATE_RX_INIT;
  152.        }
  153.    break;
  154.      
  155.    case RFLR_STATE_RX_TIMEOUT://接收超时
  156.      
  157.        if(EnableMaster)
  158.        {
  159.         RFstate=RFLR_STATE_TX_INIT;
  160.        }
  161.        else
  162.        {
  163.         RFstate=RFLR_STATE_RX_INIT;
  164.        }
  165.    break;
  166.    
  167.    default:break;
  168. }
  169. return RFstate;
  170. }
复制代码

所有资料51hei提供下载:
SI4438 Directional 硬件spi STM8S105 IAR.rar (10.74 MB, 下载次数: 34)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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