求大家给一个msp430硬件spi操作nrf24l01的代码吧,自己写的老是发送失败

2019-03-24 08:57发布

代码是移植的正点原子的,但是前面的spi配置部分是自己写的,大神帮忙看看哪里配置不对,硬件spi跟软件模拟spi都试过了
  1. void SPI3_Init()
  2. {
  3. #if HW_SPI
  4.   P10SEL|=BIT1+BIT2+BIT3;    //设置P10.1~P10.3外设功能
  5.   P10SEL&=~(BIT0+BIT4+BIT5);
  6.   P10DIR|=BIT0+BIT1+BIT3+BIT4;     //设置CS,MOSI,CLK,CE,为输出方向
  7.   P10DIR&=~(BIT2+BIT5);             //设置MISO为输入方向
  8.   P10DS|=BIT0+BIT1+BIT3+BIT4;     
  9.   P10REN|=BIT2+BIT5;              //设置MISO上拉
  10.   P10OUT|=BIT1+BIT2+BIT5;
  11.   P10OUT&=~BIT0+BIT3;
  12.   UCB3CTL1|=UCSWRST;      
  13.   UCB3CTL0 =UCCKPH+UCMSB+UCMST+UCMODE_0+UCSYNC;    //3线SPI主机模式,时钟极性低,先发送MSB
  14.   UCB3CTL0&=~(UCCKPL);
  15.   UCB3CTL1|=UCSSEL_2;          ///选择SMCLK
  16.   UCB3BR0=5;                  //25M/5=5M <10M
  17.   UCB3BR1=0;
  18.   UCB3CTL1&=~UCSWRST;
  19.   UCB3IE &= ~(UCRXIE+UCTXIE);  //不开中断
  20. //  UCB3IFG&=~UCRXIFG;
  21. #elif !HW_SPI
  22.   P10DIR|=BIT0+BIT1+BIT3+BIT4;  
  23.   P10DIR&=~(BIT2+BIT5);
  24.   P10DS|=BIT0+BIT1+BIT3+BIT4;     
  25.   P10REN|=BIT2+BIT5;           
  26.   P10OUT|=BIT2+BIT5;
  27.   P10OUT&=~BIT3;
  28. #endif
  29. }

  30. //连接方式
  31.     //P10.0->CSN    P10.1->MOSI
  32.     //P10.2->MISO   P10.3->CLK
  33.     //P10.4->CE     P10.5->IRQ

  34. u8 SPI3_SendReceiveByte(u8 byte)
  35. {
  36.   u8 val;
  37. #if HW_SPI
  38.   while (!(UCB3IFG&UCTXIFG));   //等待TXBUF为空
  39.   UCB3TXBUF=byte;
  40.   while((UCB3STAT&UCBUSY)&&(!(UCB3IFG&UCRXIFG)));    //等待发送跟接收完成
  41.   val=UCB3RXBUF;
  42. #elif !HW_SPI
  43.   u8 i;
  44.   for(i=0;i<8;i++)
  45.   {
  46.     if(byte&0x80)
  47.       NRFMOSI_1;
  48.     else
  49.       NRFMOSI_0;
  50.     byte<<=1;
  51.     NRFCLK_1;
  52.     if(NRFMISO)
  53.       byte|=0x01;
  54.     NRFCLK_0;
  55.   }
  56.   val=byte;
  57. #endif
  58.   return val;
  59.   
  60. }
复制代码

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
jianping-sun
1楼-- · 2019-03-26 15:24
cjm1234 发表于 2016-6-26 22:57
楼主能贴下成功的代码嘛?感谢
  1. #include "NRF24L01.h"

  2. //P9.0 -> CE
  3. //P9.4 -> CSN
  4. //P9.5 -> IRQ


  5. uint8_t TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //Send Addr
  6. uint8_t RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //Receive Addr

  7. void NRF_GPIO_Config()  
  8. {
  9.   P9SEL &= ~(BIT0 + BIT4);
  10.   P9DIR |= BIT0 + BIT4;
  11.   P9DIR &= ~BIT5;
  12.   P9DS |= BIT0 + BIT4;
  13. }

  14. uint8_t NRF_WriteReg(uint8_t reg,uint8_t val)
  15. {
  16.   uint8_t temp = 0;
  17.   NRF_CSN_0;
  18.   temp = SPI2_SendReceive_SingleByte(reg);
  19.   SPI2_SendReceive_SingleByte(val);
  20.   NRF_CSN_1;
  21.   return temp;
  22. }

  23. uint8_t NRF_ReadReg(uint8_t reg)
  24. {
  25.   uint8_t val = 0;
  26.   NRF_CSN_0;
  27.   SPI2_SendReceive_SingleByte(reg);
  28.   val=SPI2_SendReceive_SingleByte(0xFF);
  29.   NRF_CSN_1;
  30.   return val;
  31. }

  32. uint8_t NRF_ReadBuf(uint8_t reg,uint8_t *buff,uint8_t num)
  33. {
  34.   uint8_t i = 0,val = 0;
  35.   NRF_CSN_0;
  36.   val = SPI2_SendReceive_SingleByte(reg);
  37.   for(i = 0;i < num;i++)
  38.     buff[i] = SPI2_SendReceive_SingleByte(0xFF);
  39.   NRF_CSN_1;
  40.   return val;
  41. }

  42. uint8_t NRF_WriteBuf(uint8_t reg,uint8_t *buff,uint8_t num)
  43. {
  44.   uint8_t val = 0,i = 0;
  45.   NRF_CSN_0;
  46.   val = SPI2_SendReceive_SingleByte(reg);
  47.   for(i = 0;i < num;i++)
  48.     SPI2_SendReceive_SingleByte(buff[i]);
  49.   NRF_CSN_1;
  50.   return val;
  51. }

  52. void Set_Rx_Mode()
  53. {
  54.   NRF_CE_0;
  55.   NRF_WriteReg(WRITE_REG+CONFIG, 0x0F);
  56.   NRF_CE_1;
  57.   delay_ms(1);
  58. }
  59. void Set_Tx_Mode()
  60. {
  61.   NRF_CE_0;
  62.   NRF_WriteReg(WRITE_REG+CONFIG, 0x0E);
  63.   NRF_CE_1;
  64.   delay_ms(1);
  65. }

  66. uint8_t NRF_SendPacket(uint8_t *TxBuf)
  67. {
  68.   uint8_t val = 0;
  69.   NRF_CE_0;
  70.   NRF_WriteBuf(WR_TX_PLOAD,TxBuf,TX_PLOAD_WIDTH);
  71.   Set_Tx_Mode();
  72.   NRF_CE_1;
  73.   delay_ms(1);
  74. //  while(NRF_IRQ != 0);
  75.   val=NRF_ReadReg(STATUS);
  76.   NRF_WriteReg(WRITE_REG+STATUS,0xFF);
  77.   if(val&TX_OK)
  78.     return TX_OK;
  79.   if(val&MAX_TX)
  80.   {
  81.     NRF_WriteReg(WRITE_REG+STATUS,0xff);
  82.     NRF_WriteReg(FLUSH_TX,0xFF);
  83.     return MAX_TX;
  84.   }
  85.   return 0xFF;
  86. }

  87. uint8_t NRF_ReceivePacket(uint8_t *RxBuf)
  88. {
  89.   uint8_t val = 0;
  90.   NRF_CE_0;
  91.   Set_Rx_Mode();
  92.   NRF_CE_1;
  93.   delay_us(500);
  94.   while(NRF_IRQ != 0);
  95.   val=NRF_ReadReg(STATUS);
  96.   if(val&RX_OK)
  97.   {
  98.     NRF_ReadBuf(RD_RX_PLOAD,RxBuf,RX_PLOAD_WIDTH);
  99.     NRF_WriteReg(FLUSH_RX,0xff);
  100.     return 0;
  101.   }
  102.   return 0xff;
  103. }

  104. void NRF_Config()
  105. {
  106.   delay_us(1000);
  107.   NRF_GPIO_Config();
  108.   SPI2_Init();
  109.   delay_us(250);
  110.   NRF_CE_0;
  111.   NRF_CSN_1;
  112.   P9OUT &= ~BIT3;
  113.   NRF_WriteBuf(WRITE_REG + TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
  114.   NRF_WriteBuf(WRITE_REG + RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);
  115.   NRF_WriteReg(WRITE_REG + EN_AA,0x01);
  116.   NRF_WriteReg(WRITE_REG + EN_RXADDR,0x01);
  117.   NRF_WriteReg(WRITE_REG + RF_CH,0);
  118.   NRF_WriteReg(WRITE_REG + RX_PW_P0,RX_PLOAD_WIDTH);
  119.   NRF_WriteReg(WRITE_REG + RF_SETUP,0x07);
  120. }
复制代码

一周热门 更多>

相关问题

    相关文章