微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > 关于arm+nrf24l01通信,请高手指点

关于arm+nrf24l01通信,请高手指点

时间:10-02 整理:3721RD 点击:
情部况是这样的,我想做linux arm + nrf24l01通信, 在网上找了一些资料,调试了很久才把驱动编译完成,本以为可以用了,测试一下发不出数据,和厂家送的资料对比了一下,也没发出问题,现在很困惑,

  1. #include <linux/config.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/fs.h>
  5. #include <linux/init.h>
  6. #include <linux/devfs_fs_kernel.h>
  7. #include <linux/miscdevice.h>
  8. #include <linux/delay.h>
  9. #include <asm/irq.h>
  10. #include <asm/arch/regs-gpio.h>
  11. #include <asm/hardware.h>
  12. #include <asm/uaccess.h>

  13. MODULE_LICENSE("GPL");

  14. typedef unsigned int uint16;
  15. typedef unsigned char uint8;

  16. #define CSN                 S3C2410_GPF3
  17. #define CSN_OUTP        S3C2410_GPIO_OUTPUT
  18. #define MOSI                S3C2410_GPF4
  19. #define MOSI_OUTP        S3C2410_GPIO_OUTPUT
  20. #define IRQ                        S3C2410_GPG3
  21. #define IRQ_INP                S3C2410_GPIO_INPUT
  22. #define MISO                S3C2410_GPG0
  23. #define MISO_INP        S3C2410_GPIO_INPUT
  24. #define SCK                        S3C2410_GPG5
  25. #define SCK_OUTP                S3C2410_GPIO_OUTPUT
  26. #define CE                        S3C2410_GPG6
  27. #define CE_OUTP                S3C2410_GPIO_OUTPUT
  28. #define DEVICE_NAME        "NRF24L01"
  29. #define NRF24L01_MAJOR 255
  30. #define TxBufSize 32

  31. uint8 TxBuf[TxBufSize] = {
  32. 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
  33. 0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
  34. 0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
  35. 0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
  36. };
  37. #define CE_OUT                s3c2410_gpio_cfgpin(CE,CE_OUTP)
  38. #define CE_UP                s3c2410_gpio_pullup(CE,1)
  39. #define CE_L                s3c2410_gpio_setpin(CE,0)
  40. #define CE_H                 s3c2410_gpio_setpin(CE,1)
  41. #define SCK_OUT                s3c2410_gpio_cfgpin(SCK,SCK_OUTP)
  42. #define SCK_UP                 s3c2410_gpio_pullup(SCK,1)
  43. #define SCK_L                s3c2410_gpio_setpin(SCK,0)
  44. #define SCK_H                 s3c2410_gpio_setpin(SCK,1)
  45. #define MISO_IN                s3c2410_gpio_cfgpin(MISO,MISO_INP)
  46. #define MISO_UP         s3c2410_gpio_pullup(MISO,1)
  47. #define MISO_STU        s3c2410_gpio_getpin(MISO)
  48. #define IRQ_IN                s3c2410_gpio_cfgpin(IRQ,IRQ_INP)
  49. #define IRQ_UP                s3c2410_gpio_pullup(IRQ,1)
  50. #define IRQ_L                s3c2410_gpio_setpin(IRQ,0)
  51. #define IRQ_H                s3c2410_gpio_setpin(IRQ,1)
  52. #define MOSI_OUT        s3c2410_gpio_cfgpin(MOSI,MOSI_OUTP)
  53. #define MOSI_UP         s3c2410_gpio_pullup(MOSI,1)
  54. #define MOSI_L                s3c2410_gpio_setpin(MOSI,0)
  55. #define MOSI_H                s3c2410_gpio_setpin(MOSI,1)
  56. #define CSN_OUT                s3c2410_gpio_cfgpin(CSN,CSN_OUTP)
  57. #define CSN_UP                 s3c2410_gpio_pullup(CSN,1)
  58. #define CSN_L                s3c2410_gpio_setpin(CSN,0)
  59. #define CSN_H                 s3c2410_gpio_setpin(CSN,1)

  60. #define TX_ADR_WIDTH         5
  61. #define RX_ADR_WIDTH         5
  62. #define TX_PLOAD_WIDTH         32
  63. #define RX_PLOAD_WIDTH         32
  64. uint8 const TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};
  65. uint8 const RX_ADDRESS[RX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};

  66. #define READ_REG                0x00
  67. #define WRITE_REG                 0x20
  68. #define RD_RX_PLOAD         0x61
  69. #define WR_TX_PLOAD         0xA0
  70. #define FLUSH_TX                 0xE1
  71. #define FLUSH_RX                 0xE2
  72. #define REUSE_TX_PL         0xE3
  73. #define NOP                         0xFF

  74. #define CONFIG                         0x00
  75. #define EN_AA                         0x01
  76. #define EN_RXADDR                 0x02
  77. #define SETUP_AW                 0x03
  78. #define SETUP_RETR                 0x04
  79. #define RF_CH                         0x05
  80. #define RF_SETUP                 0x06
  81. #define STATUS                         0x07
  82. #define OBSERVE_TX                 0x08
  83. #define CD                                 0x09
  84. #define RX_ADDR_P0                 0x0A
  85. #define RX_ADDR_p1                 0x0B
  86. #define RX_ADDR_P2                 0x0C
  87. #define RX_ADDR_P3                 0x0D
  88. #define RX_ADDR_P4                 0x0E
  89. #define RX_ADDR_P5                 0x0F
  90. #define TX_ADDR                 0x10
  91. #define RX_PW_P0                 0x11
  92. #define RX_PW_P1                 0x12
  93. #define RX_PW_P2                 0x13
  94. #define RX_PW_P3                0x14
  95. #define RX_PW_P4                0x15
  96. #define RX_PW_P5                 0x16
  97. #define FIFO_STATUS         0x17

  98. uint8 init_NRF24L01(void);
  99. uint8 SPI_RW(uint8 tmp);
  100. uint8 SPI_Read(uint8 reg);
  101. void SetRX_Mode(void);
  102. void SetTX_Mode(void);
  103. uint8 SPI_RW_Reg(uint8 reg,uint8 value);
  104. uint8 SPI_Read_Buf(uint8 reg,uint8 *pBuf,uint8 uchars);
  105. uint8 SPI_Write_Buf(uint8 reg,uint8 *pBuf,uint8 uchars);
  106. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
  107. void nRF24L01_TxPacket(unsigned char *tx_buf);

  108. uint8 opencount = 0;
  109. uint8 sta;
  110. #define RX_DR         6
  111. #define TX_DS         5
  112. #define MAX_RT          4

  113. uint8 init_NRF24L01(void)
  114. {
  115.         MISO_UP;
  116.         CE_OUT;
  117.         CSN_OUT;
  118.         SCK_OUT;
  119.         MOSI_OUT;
  120.         MISO_IN;
  121.         IRQ_IN;
  122.         udelay(500);
  123.         CE_L;
  124.         ndelay(60);
  125.         CSN_H;
  126.         ndelay(60);
  127.         SCK_L;
  128.         ndelay(60);
  129.         SPI_Write_Buf(WRITE_REG + TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
  130.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);
  131.         SPI_RW_Reg(WRITE_REG + EN_AA,0x00);
  132.         SPI_RW_Reg(WRITE_REG + EN_RXADDR,0x01);
  133.         SPI_RW_Reg(WRITE_REG + RF_CH,0);
  134.         SPI_RW_Reg(WRITE_REG + RX_PW_P0,RX_PLOAD_WIDTH);
  135.         SPI_RW_Reg(WRITE_REG + RF_SETUP,0x07);
  136.         SPI_RW_Reg(WRITE_REG + CONFIG,0x0f);
  137.         mdelay(1000);
  138. //        nRF24L01_TxPacket(TxBuf);
  139. //        SPI_RW_Reg(WRITE_REG + STATUS,0xff);
  140. //        printk("test 1\n");
  141.         mdelay(1000);
  142.         return 1;
  143. }

  144. uint8 SPI_RW(uint8 tmp)
  145. {
  146.         uint8 bit_ctr;
  147.         for(bit_ctr = 0;bit_ctr < 8;bit_ctr++)
  148.         {
  149.                 if(tmp&0x80)
  150.                         MOSI_H;
  151.                 else
  152.                         MOSI_L;
  153.                 tmp<<=1;
  154.                 SCK_H;
  155.                 ndelay(60);
  156.                 tmp |= MISO_STU;
  157.                 SCK_L;
  158.                 ndelay(60);
  159.         }
  160.         return(tmp);
  161. }

  162. uint8 SPI_Read(uint8 reg)
  163. {
  164.         uint8 reg_val;
  165.         CSN_L;
  166.         ndelay(60);
  167.         SPI_RW(reg);
  168.         reg_val = SPI_RW(0);
  169.         CSN_H;
  170.         ndelay(60);
  171.         return reg_val;
  172. }

  173. uint8 SPI_RW_Reg(uint8 reg,uint8 value)
  174. {
  175.         uint8 status;
  176.         CSN_L;
  177.         ndelay(60);
  178.         status = SPI_RW(reg);
  179.         SPI_RW(value);
  180.         CSN_H;
  181.         ndelay(60);
  182.         return(status);
  183. }

  184. uint8 SPI_Read_Buf(uint8 reg,uint8 *pBuf,uint8 uchars)
  185. {
  186.         uint8 status ,uint8_ctr;

  187.         CSN_L;
  188.         ndelay(60);
  189.         status = SPI_RW(reg);
  190.        
  191.         for(uint8_ctr = 0;uint8_ctr < uchars;uint8_ctr++)
  192.         {
  193.                 pBuf[uint8_ctr] = SPI_RW(0);
  194.                 ndelay(20);
  195.         }
  196.        
  197.         CSN_H;
  198.         ndelay(60);;
  199.         return (status);
  200. }

  201. uint8 SPI_Write_Buf(uint8 reg,uint8 *pBuf,uint8 uchars)
  202. {
  203.         uint8 status,uint8_ctr;
  204.        
  205.         CSN_L;
  206.         ndelay(60);
  207.         status = SPI_RW(reg);
  208.         ndelay(60);
  209.         for(uint8_ctr = 0;uint8_ctr < uchars;uint8_ctr++)
  210.         {
  211.                 SPI_RW(*pBuf++);
  212.                 ndelay(20);
  213.         }
  214.         CSN_H;
  215.         ndelay(60);
  216.         return status;
  217. }

  218. void SetRX_Mode(void)
  219. {
  220.         CE_L;
  221.         ndelay(60);
  222. //        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
  223. //        SPI_RW_Reg(WRITE_REG + EN_AA,0x01);
  224. //        SPI_RW_Reg(WRITE_REG + EN_RXADDR,0x01);
  225. //        SPI_RW_Reg(WRITE_REG + RF_CH,40);
  226. //        SPI_RW_Reg(WRITE_REG + RX_PW_P0,TX_PLOAD_WIDTH);
  227. //        SPI_RW_Reg(WRITE_REG + RF_SETUP,0x07);
  228. //        SPI_RW_Reg(WRITE_REG + CONFIG,0x0f);
  229.         CE_H;
  230.         udelay(131);
  231. }

  232. void SetTX_Mode(void)
  233. {
  234.         udelay(100);
  235.         CE_L;
  236.         CSN_H;
  237.         SCK_L;
  238.         SPI_Write_Buf(WRITE_REG + TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
  239.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
  240.         SPI_Write_Buf(WR_TX_PLOAD,TxBuf,TX_PLOAD_WIDTH);
  241.         SPI_RW_Reg(WRITE_REG + EN_AA,0x00);//0x01
  242.         SPI_RW_Reg(WRITE_REG + EN_RXADDR,0x01);//0x01
  243.         SPI_RW_Reg(WRITE_REG + SETUP_RETR,0x00);//0x1a
  244.         SPI_RW_Reg(WRITE_REG + RF_CH,0);
  245.         SPI_RW_Reg(WRITE_REG + RX_PW_P0,RX_PLOAD_WIDTH);
  246.         SPI_RW_Reg(WRITE_REG + RF_SETUP,0x07);
  247.         SPI_RW_Reg(WRITE_REG + CONFIG,0x0e);
  248. //        CE_H;
  249.         udelay(1000);
  250. }

  251. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  252. {
  253.         unsigned char revale = 0;
  254.         sta = SPI_Read(STATUS);
  255.         if(sta&(1<<RX_DR))
  256. //        if(RX_DR == 1)
  257.         {
  258.                 CE_L;
  259.                 udelay(50);
  260.                 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
  261.                 revale = 1;
  262.         }
  263.         SPI_RW_Reg(WRITE_REG + STATUS,sta);
  264.         return revale;
  265. }

  266. void nRF24L01_TxPacket(unsigned char* tx_buf)
  267. {
  268.         CE_L;
  269.         ndelay(60);
  270.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
  271.         SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
  272.         SPI_RW_Reg(WRITE_REG + CONFIG,0x0e);
  273.         CE_H;
  274.         printk("==%x=%x== ",SPI_RW(STATUS),SPI_RW(FIFO_STATUS));
  275.         udelay(10);
  276. }

  277. static ssize_t nrf24l01_write(struct file *filp,const char *buffer,size_t count,loff_t* ppos)
  278. {
  279.         int n1 = 0;
  280.         int n2 = 0;

  281.         if(copy_from_user(&TxBuf,buffer,count))
  282.         {
  283.                 printk("Can't Send Data! --%d\n",count);
  284.                 return -EFAULT;
  285.         }
  286.         nRF24L01_TxPacket(TxBuf);
  287.         n1 = SPI_RW( STATUS);
  288.         n2 = SPI_RW(FIFO_STATUS);
  289.     printk(" %x- %x ",n1,n2);
  290. //        SPI_RW_Reg(FLUSH_TX,0x00);
  291.         SPI_RW_Reg(WRITE_REG + STATUS,0xff);

  292.         return 0;
  293. }

  294. static ssize_t nrf24l01_read(struct file* filp,char* buffer,size_t count,loff_t *ppos)
  295. {
  296.         int ret = -1;

  297.         SetRX_Mode();
  298.         mdelay(100);
  299.         nRF24L01_RxPacket(TxBuf);
  300. //        ret = copy_to_user(buffer,TxBuf,count);
  301.         SPI_RW_Reg(WRITE_REG + STATUS,0xff);
  302. //        if(ret > 0) return -EFAULT;
  303. //        else return 0;       
  304.         return 10;
  305. }

  306. static int nrf24l01_open(struct inode* node,struct file *file)
  307. {
  308.         uint8 flag = 0;
  309.         if(opencount == 1)
  310.                 return -EBUSY;
  311.         flag = init_NRF24L01();
  312.         mdelay(100);
  313.         if(flag == 0)
  314.         {
  315.                 printk("unable to open device \n");
  316.                 return -1;
  317.         }
  318.         else
  319.         {
  320.                 opencount++;
  321.                 printk("device opened !\n");
  322.                 return 0;
  323.         }
  324. }

  325. static int nrf24l01_release(struct inode* node,struct file* file)
  326. {
  327.         opencount--;
  328.         printk(DEVICE_NAME"release!\n");
  329.         return 0;
  330. }
  331.        
  332. static struct file_operations nrf24l01_fops = {
  333.         .owner = THIS_MODULE,
  334.         .open = nrf24l01_open,
  335.         .write = nrf24l01_write,
  336.         .read = nrf24l01_read,
  337.         .release = nrf24l01_release,
  338. };

  339. static int __init nrf24l01_init(void)
  340. {
  341.         int ret;
  342.        
  343.         printk("Initial driver for NRF24L01 .....\n");
  344.         ret = register_chrdev(NRF24L01_MAJOR,DEVICE_NAME,&nrf24l01_fops);
  345.         mdelay(10);
  346.         if(ret < 0)
  347.         {
  348.                 printk(DEVICE_NAME" can't register major number \n");
  349.                 return ret;
  350.         }
  351.         else
  352.         {
  353.                 printk(DEVICE_NAME "register success \n");
  354.                 devfs_mk_cdev(MKDEV(NRF24L01_MAJOR, 0), S_IFCHR | S_IRUSR | S_IWUSR |S_IRGRP, DEVICE_NAME);

  355.                 return 0;
  356.         }
  357. }

  358. static void __exit nrf24l01_exit(void)
  359. {
  360.         devfs_remove(DEVICE_NAME);
  361.         unregister_chrdev(NRF24L01_MAJOR,DEVICE_NAME);
  362.         printk("NRF24L01 unregister success \n");
  363. }

  364. module_init(nrf24l01_init);
  365. module_exit(nrf24l01_exit);

复制代码

本人小白,刚开始学习嵌入式,硬件功底不好,现在这里也米有仪器,也不能检测,都困惑了好几天了,请高手来指点一下吧

要要示波器看相关的引脚才能调试呢 网上的代码需要根据实际的情况进行移植才能使用

不错,下载下来看看。

看一下是否真的驱动起来了,还是你发送的数据格式有错,还是时序上有问题,你可以用示波器看一下波形

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top