社区导航

 
查看: 1514|回复: 0

[资料分享] MSP430+NRF2401代码,第一次好好的分析

[复制链接]

3360

TA的帖子

421

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

荣誉会员勋章

发表于 2013-11-29 19:17:21 | 显示全部楼层 |阅读模式
看陌生代码还是source insight方便,而且刚开始用没多久,还处于蜜月期,总觉得这工具相当不错的啦。当然,Linux平台还是vim+ctags用起来爽。调用关系显示的很清楚,只是屏幕小了点,看着确实少了点,上网本,就将就点吧。

两个单片机,两个文件代码。第一件事就是找main函数。呃,main函数放在最后,跟个人习惯很不一样。
void main(void)
{
    WDTCTL=WDTPW+WDTHOLD;
    _DINT();
    Init_Port1();
    IO_Init();
    LCD_Init();
    CLEAR();
    ……
}
第一件事是杀狗,嗯嗯,以后一直要记得。
先禁止中断,然后把该初始化的初始化好,单片机才能好好工作么~
然后是端口和芯片的初始化,由于功能比较单一,只要三个初始化函数就好了。

然后是显示开机界面的显示,液晶屏显示还是很不错的
    key11='M';
// LCDL='安';
    //汉字显示示例
    writechinese(0x80,"XX大学");
    writechinese(0x90,"XX学院");
    writechinese(0x88,"无线监测模拟装置");
    Delayus(100000);
    CLEAR();
    writechinese(0x80,"调试接收模式");
//writechinese(0x90,"1-单独探测节点");
//writechinese(0x88,"2-轮巡模式");
    keyflg=0;
    bostart=0x00;
    boflg=0x00;
    key_Init();
顺便设置了一下初始参数和键盘接口,下面就是设置无线接收模块的设置(根据函数名猜功能,毕竟第一步是把main函数看完)
    Init_nRF24L01_IO();
    nRF24L01_RX_MODE();
    nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Rx_Address,5);
    nRF24L01_Flush_RX_FIFO();
    nRF24L01_CE_1;
    _EINT();
IO接口设置好,无线模块模式设置好,再把接收的内存区设置好,然后开启中断。
啦啦啦,之后就开始等着另一片发数据过来处理。
do
    {
        key11='w' ;
        key_read();
    }
    while(1);
类似消息循环模式,不过是死循环,看来要关机就只能直接断电了,反正小东西玩不坏,嘿嘿~

第二个发射模块的单片机程序就相对简单点,就是少了几行代码。具体的没跟踪进去看,看来两个功能的差距就在key_read()函数里面了。
    key_Init();
    Init_nRF24L01_IO();
    _EINT();
    do
    {
        key11='w' ;
        key_read();
    }
    while(1);
main函数结束了,然后就是各个函数进去看了

先看看接收和发送这两个中断函数
#pragma vector=PORT1_VECTOR
__interrupt void P1_ISR(void)
{
    _DINT();
    P1IFG=0;
    P1IE=0;
    P1IES=0;
    Delayus(500);
    CLEAR();
    writechinese(0x80,"正在接收");
    nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_STATUS,0x4e);//Reset_Rx_DS
    nRF24L01_Read_Rx_Payload(Rx_Buff,3);
    nRF24L01_Flush_RX_FIFO();
    print_data();
    writechinese(0x88,"接收成功");
    IO_Init();
    Init_Port1();
    _EINT();
}
#pragma vector=PORT1_VECTOR
__interrupt void P1_ISR(void)
{
    _DINT();
    P1IFG=0;
    P1IE=0;
    P1IES=0;
    Delayus(500);
    writechinese(0x88,"发送成功");
    IO_Init();
    Init_Port1();
    _EINT();
}
#pragma这个不熟悉,呃……看来C语言没学好。
不写了,先到这里,明天慢慢看。

(key_read()函数怎么看怎么想重写,风格问题吧)



====================================================================
第二天了。。。
花了大力气把key_read()函数重写了一遍,个人感觉舒服多了,把大量的if-else改为switch,应该好理解多了。
顺便把变量key11改为keyCol,这个看起来就明白多了。
void key_read()
{
   
    //第一排扫描
    P6OUT=0x18 ;
    Delayus(100);
    key0=P5IN&0x70 ;

switch ( key0 )
  {
  case 0x30:
   keyCount = '1';
   switch ( keyflg )
    {
    case 0:
     CLEAR();
     writechinese(0x80,"单独探测节点");
     writechinese(0x90,"1-选择1#节点");
     writechinese(0x88,"2-选择2#节点");
     writechinese(0x98,"g-返回主菜单");
     keyflg=1 ;
     break;
    case 1:
     CLEAR();
     writechinese(0x80,"寻检1#节点");
     // Tx_Address[5]={100,101,102,103,111};
     writechinese(0x90,"d-确认,g-返回");
     keyflg=2 ;
     break;
    }
   break;
  case 0x40:
   keyCount = '2';
   switch ( keyflg )
    {
    case 0:     
     CLEAR();
     writechinese(0x80,"轮寻模式");
     writechinese(0x90,"d-确认,g-返回");
     keyflg=4 ;
     break;
    case 1:     
     CLEAR();
     writechinese(0x80,"寻检2#节点");
     writechinese(0x90,"d-确认,g-返回");
     keyflg=3 ;
     break;
    }
   
  case 0x50:
   keyCount = '3' ;
   break;
  case 0x60:
   keyCount = '4' ;
   break;
  }
if ( keyCount )
  {
  Delayus(KEY_DEALY);
  }
//第一排扫描结束
    //第二排扫描
    P6OUT=0x20 ;
    Delayus(100);
    key0=P5IN&0x70 ;
switch ( key0 )
  {
  case 0x30:
   keyCount='5' ;
         CLEAR();
         nRF24L01_TX_MODE();
         nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Tx_Address,5);
         writechinese(0x80,"正在发送");
         nRF24L01_Flush_TX_FIFO();
         nRF24L01_Set_Tx_Address(nRF24L01_W_REGISTER+nRF24L01_TX_ADDR,Tx_Address,5);
         // 指定接收方的地址
         nRF24L01_Write_Tx_Payload(Tx_Payload,3);
         //把1 字节数据放入FIFO
         nRF24L01_Transmit_Data();
         //启动发送,发送完成后进入Standby-I 模式
         print_data();
   break;
  case 0x40:
   {
    ulong buffer ;
    uchar i ;
    keyCount='6' ;
    CLEAR();
    writechinese(0x80,"当前温度");
    buffer=convert();
    print_tmp(buffer);
    for(i=0;i<8;i++)
    {
     Tx_Payload[1]=Tx_Payload[1]<<1 ;
     if(buffer&BITF?1:0)
     Tx_Payload[1]|=1 ;
     buffer=buffer<<1 ;
    }
    for(i=0;i<8;i++)
    {
     Tx_Payload[0]=Tx_Payload[0]<<1 ;
     if(buffer&BITF?1:0)
     Tx_Payload[0]|=1 ;
     buffer=buffer<<1 ;
    }
    // print_tmp1();
   }
   break;
  case 0x50:
   keyCount = '7' ;
   break;
  case 0x60:
   keyCount = '8' ;
   break;
  }
if ( keyCount)
  {
  Delayus(KEY_DEALY);
  }
//第二排扫描结束
   
    //第三排扫描
    P6OUT=0x28 ;
    Delayus(100);
    key0=P5IN&0x70 ;
switch ( key0 )
  {
  case 0x30:
   keyCount = '9' ;
   break;
  case 0x40:
   keyCount = 'A' ;
   break;
  case 0x50:
   keyCount = 'B' ;
   break;
  case 0x60:
   keyCount = 'C' ;
   break;
  }

if ( keyCount)
  {
  Delayus(KEY_DEALY);
  }

//第三排扫描结束
   
    //第四排扫描
    P6OUT=0x30 ;
    Delayus(100);
    key0=P5IN&0x70 ;
switch ( key0 )
  {
  case 0x30:
   keyCount = 'D';
   switch ( keyflg )
    {
    case 2:
     
     CLEAR();
     writechinese(0x80,"发送1#节点请求");
     nRF24L01_TX_MODE();
     nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Tx_Address1,5);
     nRF24L01_Flush_TX_FIFO();
     nRF24L01_Set_Tx_Address(nRF24L01_W_REGISTER+nRF24L01_TX_ADDR,Tx_Address1,5);
     // 指定接收方的地址
     nRF24L01_Write_Tx_Payload(Tx_Payload,3);
     //把1 字节数据放入FIFO
     nRF24L01_Transmit_Data();
     //启动发送,发送完成后进入Standby-I 模式
     
     Init_nRF24L01_IO();
     nRF24L01_RX_MODE();
     //等待接收
     nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Rx_Address,5);
     nRF24L01_Flush_RX_FIFO();
     nRF24L01_CE_1 ;
     key_isr=1 ;
     _EINT();
     do
     {
      keyCount='w' ;
      key_read();
      
     }
     while(1);
     //发送1号节点请求
     break;
    case 3:
     
     CLEAR();
     writechinese(0x80,"发送2#节点请求");
     nRF24L01_TX_MODE();
     nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Tx_Address2,5);
     nRF24L01_Flush_TX_FIFO();
     nRF24L01_Set_Tx_Address(nRF24L01_W_REGISTER+nRF24L01_TX_ADDR,Tx_Address2,5);
     // 指定接收方的地址
     nRF24L01_Write_Tx_Payload(Tx_Payload,3);
     //把1 字节数据放入FIFO
     nRF24L01_Transmit_Data();
     //启动发送,发送完成后进入Standby-I 模式
     Init_nRF24L01_IO();
     nRF24L01_RX_MODE();
     //等待接收
     nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Rx_Address,5);
     nRF24L01_Flush_RX_FIFO();
     nRF24L01_CE_1 ;
     key_isr=1 ;
     _EINT();
     do
     {
      keyCount='w' ;
      key_read();
      
     }
     while(1);
     //发送2号节点请求
     break;
    case 4:
     
     CLEAR();
     writechinese(0x80,"发送1#节点请求");
     
     keyflg=2 ;
     
     Delayus(20000);
     writechinese(0x80,"发送2#节点请求");
     
     keyflg=3 ;
     _EINT();
     break;
    }
   break;
  case 0x40:
   keyCount = 'E' ;
   break;
  case 0x50:
   keyCount = 'F' ;
   break;
  case 0x60:
   keyCount = 'G' ;
   CLEAR();
   writechinese(0x80,"江南大学");
   writechinese(0x90,"通信与控制工程");
   writechinese(0x88,"无线监测模拟装置");
   Delayus(100000);
   CLEAR();
   writechinese(0x80,"选择接受模式");
   writechinese(0x90,"1-单独探测节点");
   writechinese(0x88,"2-轮巡模式");
   keyflg=0 ;
   Delayus(30000);
   Init_nRF24L01_IO();
   break;
  }
//第四排扫描结束
if ( keyCount)
  {
  Delayus(KEY_DEALY);
  }

}
dealyus(uint)函数里面用了宏定义,不然键盘延迟太严重了,以后慢慢调试。

下面就看的是NRF2401的功能了,看看貌似没问题。嗯嗯略过


然后就是传感器端的温度和光照模块的调试,实际测试看来数据还是不对啊,赶紧改啦。


作者:jianglutian
此帖出自MSP430论坛


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-10-23 09:19 , Processed in 0.136349 second(s), 16 queries , Gzip On, MemCache On.

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