分享

MSP430 nrf2401代码,第一次好好的分析

 筱肆 2013-01-28

MSP430+nrf2401代码,第一次好好的分析

分类: C 417人阅读 评论(6) 收藏 举报

画外音:Windows Live Writer客户端连不到csdn的服务端,只好网页写了。但是……搜狗输入法在chrome浏览器里面居然不能用搜狗输入法在bolg编辑框里面输入中文,看来只好下载Google输入法用了。看来离Google人更近一步了。

 

 

正事开始了。

 

 

看陌生代码还是source insight方便,而且刚开始用没多久,还处于蜜月期,总觉得这工具相当不错的啦。当然,Linux平台还是vim+ctags用起来爽。调用关系显示的很清楚,只是屏幕小了点,看着确实少了点,上网本,就将就点吧。

 

两个单片机,两个文件代码。第一件事就是找main函数。呃,main函数放在最后,跟个人习惯很不一样。

 

  1. void main(void)  
  2. {  
  3.     WDTCTL=WDTPW+WDTHOLD;  
  4.     _DINT();  
  5.     Init_Port1();  
  6.     IO_Init();  
  7.     LCD_Init();  
  8.     CLEAR();  
  9.     ……  
  10. }  
 

第一件事是杀狗,嗯嗯,以后一直要记得。

先禁止中断,然后把该初始化的初始化好,单片机才能好好工作么~

然后是端口和芯片的初始化,由于功能比较单一,只要三个初始化函数就好了。

 

然后是显示开机界面的显示,液晶屏显示还是很不错的

[c-sharp] view plaincopy?
  1.     key11='M';  
  2. // LCDL='安';   
  3.     //汉字显示示例   
  4.     writechinese(0x80,"XX大学");  
  5.     writechinese(0x90,"XX学院");  
  6.     writechinese(0x88,"无线监测模拟装置");  
  7.     Delayus(100000);  
  8.     CLEAR();  
  9.     writechinese(0x80,"调试接收模式");  
  10. //writechinese(0x90,"1-单独探测节点");   
  11. //writechinese(0x88,"2-轮巡模式");   
  12.     keyflg=0;  
  13.     bostart=0x00;  
  14.     boflg=0x00;  
  15.     key_Init();  
 

 

顺便设置了一下初始参数和键盘接口,下面就是设置无线接收模块的设置(根据函数名猜功能,毕竟第一步是把main函数看完)

[c-sharp] view plaincopy?
  1. Init_nRF24L01_IO();  
  2. nRF24L01_RX_MODE();  
  3. nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Rx_Address,5);  
  4. nRF24L01_Flush_RX_FIFO();  
  5. nRF24L01_CE_1;  
  6. _EINT();  
 

IO接口设置好,无线模块模式设置好,再把接收的内存区设置好,然后开启中断。

啦啦啦,之后就开始等着另一片发数据过来处理。

 

  1. do  
  2.     {  
  3.         key11='w' ;  
  4.         key_read();  
  5.     }  
  6.     while(1);  
 

 

类似消息循环模式,不过是死循环,看来要关机就只能直接断电了,反正小东西玩不坏,嘿嘿~

 

第二个发射模块的单片机程序就相对简单点,就是少了几行代码。具体的没跟踪进去看,看来两个功能的差距就在key_read()函数里面了。

  1. key_Init();  
  2. Init_nRF24L01_IO();  
  3. _EINT();  
  4. do  
  5. {  
  6.     key11='w' ;  
  7.     key_read();  
  8. }  
  9. while(1);  
 

 

 

 

main函数结束了,然后就是各个函数进去看了

 

先看看接收和发送这两个中断函数

 

  1. #pragma vector=PORT1_VECTOR   
  2. __interrupt void P1_ISR(void)  
  3. {  
  4.     _DINT();  
  5.     P1IFG=0;  
  6.     P1IE=0;  
  7.     P1IES=0;  
  8.     Delayus(500);  
  9.     CLEAR();  
  10.     writechinese(0x80,"正在接收");  
  11.     nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_STATUS,0x4e);//Reset_Rx_DS   
  12.     nRF24L01_Read_Rx_Payload(Rx_Buff,3);  
  13.     nRF24L01_Flush_RX_FIFO();  
  14.     print_data();  
  15.     writechinese(0x88,"接收成功");  
  16.     IO_Init();  
  17.     Init_Port1();  
  18.     _EINT();  
  19. }  
 

 

  1. #pragma vector=PORT1_VECTOR   
  2. __interrupt void P1_ISR(void)  
  3. {  
  4.     _DINT();  
  5.     P1IFG=0;  
  6.     P1IE=0;  
  7.     P1IES=0;  
  8.     Delayus(500);  
  9.     writechinese(0x88,"发送成功");  
  10.     IO_Init();  
  11.     Init_Port1();  
  12.     _EINT();  
  13. }  
 

 

#pragma这个不熟悉,呃……看来C语言没学好。

不写了,先到这里,明天慢慢看。

 

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

 

 

 

====================================================================

第二天了。。。

花了大力气把key_read()函数重写了一遍,个人感觉舒服多了,把大量的if-else改为switch,应该好理解多了。

顺便把变量key11改为keyCol,这个看起来就明白多了。

 

 

  1. void key_read()  
  2. {  
  3.          
  4.     //第一排扫描   
  5.     P6OUT=0x18 ;  
  6.     Delayus(100);  
  7.     key0=P5IN&0x70 ;  
  8.       
  9.     switch ( key0 )  
  10.         {  
  11.         case 0x30:  
  12.             keyCount = '1';  
  13.             switch ( keyflg )  
  14.                 {  
  15.                 case 0:  
  16.                     CLEAR();  
  17.                     writechinese(0x80,"单独探测节点");  
  18.                     writechinese(0x90,"1-选择1#节点");  
  19.                     writechinese(0x88,"2-选择2#节点");  
  20.                     writechinese(0x98,"g-返回主菜单");  
  21.                     keyflg=1 ;  
  22.                     break;  
  23.                 case 1:  
  24.                     CLEAR();  
  25.                     writechinese(0x80,"寻检1#节点");  
  26.                     // Tx_Address[5]={100,101,102,103,111};   
  27.                     writechinese(0x90,"d-确认,g-返回");  
  28.                     keyflg=2 ;  
  29.                     break;  
  30.                 }  
  31.             break;  
  32.         case 0x40:  
  33.             keyCount = '2';  
  34.             switch ( keyflg )  
  35.                 {  
  36.                 case 0:                   
  37.                     CLEAR();  
  38.                     writechinese(0x80,"轮寻模式");  
  39.                     writechinese(0x90,"d-确认,g-返回");  
  40.                     keyflg=4 ;  
  41.                     break;  
  42.                 case 1:                   
  43.                     CLEAR();  
  44.                     writechinese(0x80,"寻检2#节点");  
  45.                     writechinese(0x90,"d-确认,g-返回");  
  46.                     keyflg=3 ;  
  47.                     break;  
  48.                 }  
  49.               
  50.         case 0x50:  
  51.             keyCount = '3' ;  
  52.             break;  
  53.         case 0x60:  
  54.             keyCount = '4' ;  
  55.             break;  
  56.         }  
  57.     if ( keyCount )  
  58.         {  
  59.         Delayus(KEY_DEALY);  
  60.         }  
  61. //第一排扫描结束   
  62.   
  63.     //第二排扫描   
  64.     P6OUT=0x20 ;  
  65.     Delayus(100);  
  66.     key0=P5IN&0x70 ;  
  67.     switch ( key0 )  
  68.         {  
  69.         case 0x30:  
  70.             keyCount='5' ;  
  71.             CLEAR();  
  72.             nRF24L01_TX_MODE();  
  73.             nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Tx_Address,5);  
  74.             writechinese(0x80,"正在发送");  
  75.             nRF24L01_Flush_TX_FIFO();  
  76.             nRF24L01_Set_Tx_Address(nRF24L01_W_REGISTER+nRF24L01_TX_ADDR,Tx_Address,5);  
  77.             // 指定接收方的地址   
  78.             nRF24L01_Write_Tx_Payload(Tx_Payload,3);  
  79.             //把1 字节数据放入FIFO    
  80.             nRF24L01_Transmit_Data();  
  81.             //启动发送,发送完成后进入Standby-I 模式   
  82.             print_data();  
  83.             break;  
  84.         case 0x40:  
  85.             {  
  86.                 ulong buffer ;  
  87.                 uchar i ;  
  88.                 keyCount='6' ;  
  89.                 CLEAR();  
  90.                 writechinese(0x80,"当前温度");  
  91.                 buffer=convert();  
  92.                 print_tmp(buffer);  
  93.                 for(i=0;i<8;i++)  
  94.                 {  
  95.                     Tx_Payload[1]=Tx_Payload[1]<<1 ;  
  96.                     if(buffer&BITF?1:0)  
  97.                     Tx_Payload[1]|=1 ;  
  98.                     buffer=buffer<<1 ;  
  99.                 }  
  100.                 for(i=0;i<8;i++)  
  101.                 {  
  102.                     Tx_Payload[0]=Tx_Payload[0]<<1 ;  
  103.                     if(buffer&BITF?1:0)  
  104.                     Tx_Payload[0]|=1 ;  
  105.                     buffer=buffer<<1 ;  
  106.                 }  
  107.                 // print_tmp1();   
  108.             }  
  109.             break;  
  110.         case 0x50:  
  111.             keyCount = '7' ;  
  112.             break;  
  113.         case 0x60:  
  114.             keyCount = '8' ;  
  115.             break;  
  116.         }  
  117.     if ( keyCount)  
  118.         {  
  119.         Delayus(KEY_DEALY);  
  120.         }  
  121.   
  122. //第二排扫描结束   
  123.       
  124.     //第三排扫描   
  125.     P6OUT=0x28 ;  
  126.     Delayus(100);  
  127.     key0=P5IN&0x70 ;  
  128.     switch ( key0 )  
  129.         {  
  130.         case 0x30:  
  131.             keyCount = '9' ;  
  132.             break;  
  133.         case 0x40:  
  134.             keyCount = 'A' ;  
  135.             break;  
  136.         case 0x50:  
  137.             keyCount = 'B' ;  
  138.             break;  
  139.         case 0x60:  
  140.             keyCount = 'C' ;  
  141.             break;  
  142.         }  
  143.       
  144.     if ( keyCount)  
  145.         {  
  146.         Delayus(KEY_DEALY);  
  147.         }  
  148.       
  149.     //第三排扫描结束   
  150.       
  151.     //第四排扫描   
  152.     P6OUT=0x30 ;  
  153.     Delayus(100);  
  154.     key0=P5IN&0x70 ;  
  155.     switch ( key0 )  
  156.         {  
  157.         case 0x30:  
  158.             keyCount = 'D';  
  159.             switch ( keyflg )  
  160.                 {  
  161.                 case 2:  
  162.                       
  163.                     CLEAR();  
  164.                     writechinese(0x80,"发送1#节点请求");  
  165.                     nRF24L01_TX_MODE();  
  166.                     nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Tx_Address1,5);  
  167.                     nRF24L01_Flush_TX_FIFO();  
  168.                     nRF24L01_Set_Tx_Address(nRF24L01_W_REGISTER+nRF24L01_TX_ADDR,Tx_Address1,5);  
  169.                     // 指定接收方的地址   
  170.                     nRF24L01_Write_Tx_Payload(Tx_Payload,3);  
  171.                     //把1 字节数据放入FIFO    
  172.                     nRF24L01_Transmit_Data();  
  173.                     //启动发送,发送完成后进入Standby-I 模式   
  174.                       
  175.                     Init_nRF24L01_IO();  
  176.                     nRF24L01_RX_MODE();  
  177.                     //等待接收   
  178.                     nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Rx_Address,5);  
  179.                     nRF24L01_Flush_RX_FIFO();  
  180.                     nRF24L01_CE_1 ;  
  181.                     key_isr=1 ;  
  182.                     _EINT();  
  183.                     do   
  184.                     {  
  185.                         keyCount='w' ;  
  186.                         key_read();  
  187.                           
  188.                     }  
  189.                     while(1);  
  190.                     //发送1号节点请求   
  191.                     break;  
  192.                 case 3:  
  193.                       
  194.                     CLEAR();  
  195.                     writechinese(0x80,"发送2#节点请求");  
  196.                     nRF24L01_TX_MODE();  
  197.                     nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Tx_Address2,5);  
  198.                     nRF24L01_Flush_TX_FIFO();  
  199.                     nRF24L01_Set_Tx_Address(nRF24L01_W_REGISTER+nRF24L01_TX_ADDR,Tx_Address2,5);  
  200.                     // 指定接收方的地址   
  201.                     nRF24L01_Write_Tx_Payload(Tx_Payload,3);  
  202.                     //把1 字节数据放入FIFO    
  203.                     nRF24L01_Transmit_Data();  
  204.                     //启动发送,发送完成后进入Standby-I 模式   
  205.                     Init_nRF24L01_IO();  
  206.                     nRF24L01_RX_MODE();  
  207.                     //等待接收   
  208.                     nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Rx_Address,5);  
  209.                     nRF24L01_Flush_RX_FIFO();  
  210.                     nRF24L01_CE_1 ;  
  211.                     key_isr=1 ;  
  212.                     _EINT();  
  213.                     do   
  214.                     {  
  215.                         keyCount='w' ;  
  216.                         key_read();  
  217.                           
  218.                     }  
  219.                     while(1);  
  220.                     //发送2号节点请求   
  221.                     break;  
  222.                 case 4:  
  223.                       
  224.                     CLEAR();  
  225.                     writechinese(0x80,"发送1#节点请求");  
  226.                       
  227.                     keyflg=2 ;  
  228.                       
  229.                     Delayus(20000);  
  230.                     writechinese(0x80,"发送2#节点请求");  
  231.                       
  232.                     keyflg=3 ;  
  233.                     _EINT();  
  234.                     break;  
  235.                 }  
  236.             break;  
  237.         case 0x40:  
  238.             keyCount = 'E' ;  
  239.             break;  
  240.         case 0x50:  
  241.             keyCount = 'F' ;  
  242.             break;  
  243.         case 0x60:  
  244.             keyCount = 'G' ;  
  245.             CLEAR();  
  246.             writechinese(0x80,"江南大学");  
  247.             writechinese(0x90,"通信与控制工程");  
  248.             writechinese(0x88,"无线监测模拟装置");  
  249.             Delayus(100000);  
  250.             CLEAR();  
  251.             writechinese(0x80,"选择接受模式");  
  252.             writechinese(0x90,"1-单独探测节点");  
  253.             writechinese(0x88,"2-轮巡模式");  
  254.             keyflg=0 ;  
  255.             Delayus(30000);  
  256.             Init_nRF24L01_IO();  
  257.             break;  
  258.         }  
  259.   
  260. //第四排扫描结束   
  261.     if ( keyCount)  
  262.         {  
  263.         Delayus(KEY_DEALY);  
  264.         }  
  265.       
  266. }  
 

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

 

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

 

 

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

 

 

先发表了,没空在这边码字堆博客了,要调试的东西多着呢

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多