智能车制作

 找回密码
 注册

扫一扫,访问微社区

楼主: jamesdeep
打印 上一主题 下一主题

[分享] 那些年坑死的24L01+,终于搞好了~~

  [复制链接]

165

主题

4119

帖子

2

精华

杰出人士

老司机【呆萌侠】

Rank: 12Rank: 12Rank: 12

积分
16895

活跃会员奖章优秀会员奖章推广达人奖章热心会员奖章论坛元老奖章论坛骨干奖章在线王奖章资源大师奖章

QQ
威望
9751
贡献
4562
兑换币
1629
注册时间
2011-7-23
在线时间
1291 小时
毕业学校
工大
11#
发表于 2013-4-21 17:00:10 | 只看该作者
无线蓝牙串口
回复 支持 反对

使用道具 举报

1

主题

2067

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5124

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
2752
贡献
898
兑换币
59
注册时间
2012-12-8
在线时间
737 小时
12#
发表于 2013-4-21 17:10:29 | 只看该作者
楼主厉害啊
回复 支持 反对

使用道具 举报

37

主题

565

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4385
威望
2300
贡献
1251
兑换币
1399
注册时间
2012-9-25
在线时间
417 小时
13#
发表于 2013-4-21 23:12:07 | 只看该作者
做的第一个实验就是24l01
回复 支持 反对

使用道具 举报

19

主题

236

帖子

0

精华

跨届大侠

机械决定最高速度,软件决定能否达到最高速度。

Rank: 10Rank: 10Rank: 10

积分
6558

论坛元老奖章优秀会员奖章活跃会员奖章在线王奖章

威望
2741
贡献
2075
兑换币
1740
注册时间
2011-9-30
在线时间
871 小时
14#
 楼主| 发表于 2013-4-22 00:49:08 | 只看该作者
mxj1005071012 发表于 2013-4-21 16:28
我还有个问题 就是2401与单片机的端口连接 有特殊要求吗 是不是定义任意端口都行

如果你用IO口模拟SPI的话,那么就任意端口都能用了~下面是XS128的初始化和发送代码:

  1. #include "24L01.h"
  2. #include "N5110.h"

  3. //unsigned char nr24l01_data[34]=0;//用于向24L01寄存器发送的命令或者数据
  4. unsigned char nr24L01_data[33]=0;//用于向24L01寄存器发送的内容
  5. unsigned char nr24L01_input[8]; //status状态寄存器专用数组
  6. unsigned char nr24L01_data_receive[33];//用于保存从24L01+接收到的数据
  7. unsigned char nr24l01_register_data_send[6]=0;//仅用于向24L01寄存器发送的内容(不用于发送数据)
  8. unsigned char nr24l01_status = 0;//用于24L01状态寄存器
  9. unsigned char send_status = 0;//发送状态;0代表发送成功,1代表失败
  10. unsigned char receive_status = 0;//接收状态;0代表发送成功,1代表失败
  11. unsigned char send_data_number = 0;//准备向TX_FIFO寄存器写入的数据的数目
  12. unsigned char receive_data_number = 0;//接收到的数据的数目
  13. unsigned int volatile nrf24l01_k = 0;//用于延时

  14. //向24L01写单字节命令,返回状态寄存器值,不带有CS功能
  15. unsigned char nr24L01_write_singlecom(unsigned char com)
  16. {
  17.     unsigned char i = 0;
  18.     unsigned char j = 128;
  19.     unsigned char status = 0;
  20.     for(i=8;i!=0;i--)
  21.     {
  22.       
  23.       if((com&0x80)==0x80) MOSI = 1;
  24.       else MOSI = 0;//准备好向24L01发送的比特位
  25.       com = com << 1;
  26.       nr24l01_CLK = 1;//CLK上升沿
  27.       if(MISO == 1)
  28.       {
  29.         nr24L01_input[i-1] = 1;
  30.         status = status + j;
  31.       }
  32.       else nr24L01_input[i-1] = 0;//读取24l01p传来的状态寄存器
  33.       nr24l01_CLK = 0;//CLK下降沿
  34.       j = j/2;
  35.     }
  36.     return status;     
  37. }
  38. //向24L01写单字节命令,返回状态寄存器值,带有CS功能
  39. unsigned char nr24L01_write_singlecom_withCS(unsigned char com)
  40. {
  41.     unsigned char i = 0;
  42.     unsigned char j = 128;
  43.     unsigned char status = 0;
  44.     nr24l01_CS = 0;
  45.     for(i=8;i!=0;i--)
  46.     {
  47.       
  48.       if((com&0x80)==0x80) MOSI = 1;
  49.       else MOSI = 0;//准备好向24L01发送的比特位
  50.       com = com << 1;
  51.       nr24l01_CLK = 1;//CLK上升沿
  52.       if(MISO == 1)
  53.       {
  54.         nr24L01_input[i-1] = 1;
  55.         status = status + j;
  56.       }
  57.       else nr24L01_input[i-1] = 0;//读取24l01p传来的状态寄存器
  58.       nr24l01_CLK = 0;//CLK下降沿
  59.       j = j/2;
  60.     }
  61.     nr24l01_CS = 1;
  62.     return status;     
  63. }
  64. //向24L01读、写单字节数据
  65. unsigned char nr24L01_write_singledata(unsigned char data_transmit)
  66. {
  67.     unsigned char o = 0;
  68.     unsigned char p = 128;
  69.     unsigned char data_receive = 0;
  70.     for(o=8;o!=0;o--)
  71.     {
  72.       
  73.       if((data_transmit&0x80)==0x80) MOSI = 1;
  74.       else MOSI = 0;//准备好向24L01发送的比特位
  75.       data_transmit = data_transmit << 1;
  76.       nr24l01_CLK = 1;//CLK上升沿
  77.       if(MISO == 1)
  78.       {
  79.         data_receive = data_receive + p;
  80.       }
  81.       nr24l01_CLK = 0;//CLK下降沿
  82.       p = p/2;
  83.     }
  84.     return data_receive;
  85. }
  86. //向24L01寄存器写数据,变量为:寄存器命令,数据指针,要写入的数据字节数(不包括命令字节)
  87. unsigned char nr24L01_write_register(unsigned char com,unsigned char *data,unsigned char data_byte_number)
  88. {
  89.     unsigned status = 0;
  90.     nr24l01_CS = 0;
  91.     status = nr24L01_write_singlecom(com);//发送命令字
  92.     while(data_byte_number--)
  93.     {     
  94.       nr24L01_write_singledata(*data);//发送数据;
  95.       data++;
  96.     }
  97.     nr24l01_CS = 1;
  98.     return status;
  99. }
  100. //向24L01寄存器读取数据,变量为:寄存器命令,要读取的数据字节数(不包括命令字节)
  101. unsigned char nr24L01_read_register(unsigned char com,unsigned char data_byte_number)
  102. {
  103.     unsigned char status = 0;
  104.     unsigned char r = 0;
  105.     nr24l01_CS = 0;
  106.     status = nr24L01_write_singlecom(com);//发送命令字
  107.     for(r=0;r<data_byte_number;r++)
  108.     {     
  109.       nr24L01_data_receive[r] = nr24L01_write_singledata(0xFF);//发送空数据,用于读取数据;
  110.     }
  111.     nr24l01_CS = 1;
  112.     return status;
  113. }
  114. //24L01初始化函数
  115. void nr24L01_init(void)
  116. {
  117.     unsigned int z = 0;
  118.    
  119.     //初始化24L01p的6个引脚
  120.     DDRS = 0b11100100;//PortS2567设定为输出
  121.     nr24l01_CS = 1;//CS=1
  122.     nr24l01_CE = 0;//CE=0
  123.     nr24l01_CLK = 0;//CLK=0
  124.     MISO = 0;//MISO=0
  125.     MOSI = 0;//MOSI=0
  126.     PIEJ_PIEJ6 = 1;//使能PortJ6中断,用于IRQ中断申请
  127.    
  128.    
  129.     nr24L01_write_register(0xE1,nr24l01_register_data_send,0);//清空TX FIFO
  130.     nr24L01_write_register(0xE2,nr24l01_register_data_send,0);//清空RX FIFO
  131.     nr24l01_register_data_send[0]=0x70;
  132.     nr24L01_write_register(0x27,nr24l01_register_data_send,1);//清除MAX_RT、TX_IRQ、RX_IRQ标志位
  133.     nr24l01_register_data_send[0]=0x13;
  134.     nr24L01_write_register(0x24,nr24l01_register_data_send,1);//初始化4号寄存器,//自动重发延迟设为500us,重发次数设为3
  135.     nr24l01_register_data_send[0]=0x55;
  136.     nr24L01_write_register(0x25,nr24l01_register_data_send,1);//初始化5号寄存器,设置通信频率
  137.     nr24l01_register_data_send[0]=0x08;
  138.     nr24L01_write_register(0x26,nr24l01_register_data_send,1);//初始化6号寄存器,设置传送比特率为2Mbps
  139.     nr24l01_register_data_send[0]=0x34;nr24l01_register_data_send[1]=0x43;nr24l01_register_data_send[2]=0x10;nr24l01_register_data_send[3]=0x10;nr24l01_register_data_send[4]=0x01;      
  140.     nr24L01_write_register(0x2A,nr24l01_register_data_send,5);//初始化A号寄存器,设置0号管道接收地址
  141.     nr24l01_register_data_send[0]=0x34;nr24l01_register_data_send[1]=0x43;nr24l01_register_data_send[2]=0x10;nr24l01_register_data_send[3]=0x10;nr24l01_register_data_send[4]=0x01;        
  142.     nr24L01_write_register(0x30,nr24l01_register_data_send,5);//初始化10号寄存器,设置发送地址
  143.     nr24l01_register_data_send[0]=0x3F;
  144.     nr24L01_write_register(0x3C,nr24l01_register_data_send,1);//初始化1C号寄存器,使能6个管道的动态载荷长度
  145.     nr24l01_register_data_send[0]=0x06;
  146.     nr24L01_write_register(0x3D,nr24l01_register_data_send,1);//初始化1D号寄存器,使能应答载荷包和动态载荷长度功能  
  147.     nr24l01_register_data_send[0]=0x0A;
  148.     nr24L01_write_register(0x20,nr24l01_register_data_send,1);//初始化0号CONFIG寄存器
  149.     for(z=0;z<60000;z++);//延时
  150.     for(z=0;z<60000;z++);//延时
  151.     for(z=0;z<60000;z++);//延时
  152.     for(z=0;z<60000;z++);//延时      
  153. }

  154. void nr24L01(void)//24L01主执行函数
  155. {
  156.      nr24l01_CE = 1;//进入发送模式
  157.      if(((nr24L01_write_singlecom_withCS(0xFF))&0x10) == 0x10)//若MAX_RT最大重发次数中断为1
  158.      {
  159.         send_status = 1;//发送失败标志置1
  160.         receive_status = 1;//接收失败标志置1;
  161.         nr24l01_status = nr24L01_write_singlecom_withCS(0xE1);//清空TX_FIFO
  162.         nr24l01_register_data_send[0]=0b01110000;
  163.         nr24l01_status = nr24L01_write_register(0b00100111,nr24l01_register_data_send,1);//清除MAX_RT、TX_IRQ、RX_IRQ标志位
  164.      }
  165.      else//若MAX_RT最大重发次数中断不为1
  166.      {
  167.         if((nr24L01_write_singlecom_withCS(0xFF)&0x40) == 0x40)//若RX_IRQ数据接收中断为1
  168.         {
  169.             nr24l01_status = nr24L01_read_register(0x60,1);//读取管道0的接收数据长度
  170.             if(nr24L01_data_receive[0]<=32)//若管道0接收的数据长度小于等于32字节(即数据有效)
  171.             {
  172.                receive_data_number = nr24L01_data_receive[0];//存储接收到的数据的数目
  173.                nr24l01_status = nr24L01_read_register(0x61,receive_data_number);//读取RX FIFO数据
  174.                nr24L01_data_receive[receive_data_number] = '\0';//加入空结束字符
  175.                N5110_write_string_6_8(0, 4,nr24L01_data_receive);//
  176.                receive_status = 0;//接收失败标志清0;  
  177.             }
  178.             else//若管道0接收的数据长度大于32字节(即数据无效)
  179.             {
  180.                receive_status = 1;//接收失败标志置1;
  181.                nr24l01_status = nr24L01_write_register(0xE2,nr24l01_register_data_send,0);//清空RX FIFO
  182.             }
  183.             nr24l01_register_data_send[0]=0b01000000;
  184.             nr24l01_status = nr24L01_write_register(0b00100111,nr24l01_register_data_send,1);//清除RX_IRQ标志位
  185.         }
  186.         
  187.         if((nr24L01_write_singlecom_withCS(0xFF)&0x20) == 0x20)//若TX_IRQ数据发送中断为1
  188.         {
  189.            send_status = 0;//发送失败标志清0
  190.            nr24l01_register_data_send[0]=0b00100000;
  191.            nr24l01_status = nr24L01_write_register(0b00100111,nr24l01_register_data_send,1);//清除TX_IRQ标志位
  192.            nr24l01_status = nr24L01_write_register(0xA0,nr24L01_data,send_data_number);//利用此语句写数据至TX FIFO
  193.            nr24L01_data[0] =  nr24L01_data[0] +1;//更换发送字符,可用其他控制命令代替
  194.            if( nr24L01_data[0] >126) nr24L01_data[0] = 48;//更换发送字符,可用其他控制命令代替  
  195.         }
  196.         else//若TX_IRQ数据发送中断不为1
  197.         {
  198.             if((nr24L01_write_singlecom_withCS(0xFF)&0x01) == 0x01)//若TX_FIFO已满
  199.             {
  200.                receive_status = 1;//接收失败标志置1;
  201.                nr24l01_status = nr24L01_write_singlecom_withCS(0xE1);//清空TX_FIFO
  202.             }
  203.             else//若TX_FIFO未满
  204.             {
  205.                nr24l01_status = nr24L01_write_register(0xA0,nr24L01_data,send_data_number);//利用此语句写数据至TX FIFO
  206.             }
  207.          }      
  208.      }      
  209.      nr24l01_status = nr24L01_read_register(0x07,1);//读取寄存器内容
  210.      N5110_change_num(0,5,nr24l01_status);//向屏幕输出状态寄存器内容
  211.      for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  212.      for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  213.      for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  214.           for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  215.      for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  216.           for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  217.      for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  218.           for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  219.      for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  220.           for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  221.      for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  222.           for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  223.      for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  224.           for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)
  225.      for(nrf24l01_k=0;nrf24l01_k<60770;nrf24l01_k++);//延时20ms(主频40M,k为unsigned int volatile)  
  226.   
  227. }
复制代码



然后main函数里面是这样的:
  1. void main(void)
  2. {
  3.   nr24L01_init();//初始化24lL01P
  4.   nr24L01_data[0] = 'J';
  5.   nr24L01_data[1] = 'a';
  6.   nr24L01_data[2] = 'm';
  7.   nr24L01_data[3] = 'e';
  8.   nr24L01_data[4] = 's';
  9.   send_data_number = 5;
  10.   if(mode == 0)//若当前模式为测试模式
  11.   {
  12.       while(1)//--------------主循环----------------
  13.       {
  14.           if(en_24l01p == 1)//若无线被使能
  15.           {
  16.               nr24L01();//24l01主执行函数
  17.           }   
  18.        }   
  19.     }
  20.    
  21.    
  22. }
复制代码


回复 支持 反对

使用道具 举报

4

主题

519

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
11207

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

QQ
威望
5237
贡献
3112
兑换币
1178
注册时间
2012-2-1
在线时间
1430 小时
15#
发表于 2013-4-22 11:48:30 | 只看该作者
回复 支持 反对

使用道具 举报

22

主题

100

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1487
威望
791
贡献
452
兑换币
326
注册时间
2012-8-22
在线时间
122 小时
16#
发表于 2013-4-22 12:09:06 | 只看该作者
回复 支持 反对

使用道具 举报

16

主题

1510

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5586

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

QQ
威望
2953
贡献
1231
兑换币
29
注册时间
2012-6-2
在线时间
702 小时
17#
发表于 2013-4-22 13:04:15 | 只看该作者
回复 支持 反对

使用道具 举报

23

主题

211

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3220
威望
1562
贡献
724
兑换币
357
注册时间
2011-11-20
在线时间
467 小时
18#
发表于 2013-4-22 18:24:30 | 只看该作者
同时双向发送数据?这个厉害,怎么做的。

LZ最高速率能到多少byte/s?,我测试的大该55000个左右
回复 支持 反对

使用道具 举报

7

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1345
威望
663
贡献
350
兑换币
299
注册时间
2012-7-9
在线时间
166 小时
19#
发表于 2013-4-22 19:51:43 | 只看该作者
想问一下,如果用无线和蓝牙传送图像的话,哪一种传送的速度会比较快,快多少
回复 支持 反对

使用道具 举报

19

主题

236

帖子

0

精华

跨届大侠

机械决定最高速度,软件决定能否达到最高速度。

Rank: 10Rank: 10Rank: 10

积分
6558

论坛元老奖章优秀会员奖章活跃会员奖章在线王奖章

威望
2741
贡献
2075
兑换币
1740
注册时间
2011-9-30
在线时间
871 小时
20#
 楼主| 发表于 2013-4-22 22:50:49 | 只看该作者
bbddoop 发表于 2013-4-22 18:24
同时双向发送数据?这个厉害,怎么做的。

LZ最高速率能到多少byte/s?,我测试的大该55000个左右

没测试过多少个,用的是2Mbit/s传送速率,只要收发两端的单片机都处于极限速度,应该就能接近理论上的最高速度了
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 14:44 , Processed in 0.064188 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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