⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 使用lpc2131对nrf905进行配置通信.txt

📁 用于LPC2138对CC1000射频芯片内部寄存器编程及配置源码,非常有用的资料移植性强
💻 TXT
📖 第 1 页 / 共 2 页
字号:
21ICBBS讨论


            阅读帖子


      请教nRF905配置程序是否正确(HotPower,汽车老大,圈圈帮忙)
       ZX1221 发表于 2006-5-19 10:00 ZLG-ARM ←返回版面   

            使用LPC2131对nRF905进行配置通信,spi连接,串口显示配置!用示波器测试ARM 
            MOSI脚有数据发送,就是配置数据已经传送过去。但是读配置全部显示10个FF,没有配置进去!请教程序是否正确?
            头文件用的HOTPOWER的,所以没贴上。

            /*LPC2131控制nRF905无线芯片程序,使用SPI配置并通信
              版本:1.0
            */

            #include "config.h"
            #include "nrf905.h"
            #include <stdio.h>

            #define nRF905_PWR_UP      (1<<18)       //IO1 P1.18
            #define nRF905_TRX_CE      (1<<17)                //IO1 P1.17
            #define nRF905_TX_EN       (1<<16)                //IO1 P1.16
            #define nRF905_CD                (1<<21)                //IO1 P1.21
            #define nRF905_AM                (1<<22)                //IO1 P1.22
            #define nRF905_DR         (1<<19)          //IO1 
            P1.19做input检测dr信号(可以做外部中断2)

            #define nRF905_SCK          (1<<4)                 //IO0 P0.4
            #define nRF905_MISO        (1<<5)                   //IO0 P0.5
            #define nRF905_MOSI       (1<<6)                //IO0 P0.6
            #define nRF905_CSN         (1<<20)                   //IO1 P1.20

            #define     MASTER  //编译控制是主机还是从机
            #define     UART_BPS0     9600    // 通讯波特率2400

            #define  BufferSize  32
            uint8  Buffer1[BufferSize];        //U0Rx,U1Tx
            uint8  Buffer2[BufferSize];        //U0Tx,U1Rx

            const uint32 LED6 = (1 << 23);    // P1.18控制LED1,低电平点亮 
            const uint32 LED7 = (1 << 24);    // P1.18控制LED1,低电平点亮 
            const uint32 LED8 = (1 << 25);    // P1.18控制LED1,低电平点亮 

            volatile uint8 rcv_new; 
            uint8  ch,ch1;

            uint8 flagtext[]="send 
            data123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF...";

            void WDT_INIT(void); 
            void WDT_CLEAR(void);

            void __irq IRQ_UART0(void);
            void UART_Init (void);
            void UART0_SendByte (uint8 data);
            void UART0_SendBuf ( char *str) ;

            void MSPI_Init(void);
            uint8 nrf905_SpiRW(uint8 data);
            void nrf905_SPISendStr (uint8 *str);  
            void nrf905_SpiTest(void);
            void Config905(void);
            void nrf905_ReadData(void);
            void nrf905_SendData(void);
            void Receiver(void);
            void Transmitter(void);

            void nrf905_Off(void);
            void nrf905_StandBy(void);
            void nrf905_TxOn(void);
            void nrf905_RxOn(void);


            void WDT_INIT(void)
            {
                while(( WDMOD & 0x04 ) == 0x04)             // 判断看门狗超时标志 
                WDMOD = 0x00;    
                
                /* 初始化看门狗 */
                WDTC  = 0xffffff;                        // 设置看门狗定时器参数
                WDMOD = 0x01;                                // 看门狗中断使能
                WDFEED = 0xAA;                              // 第一次喂狗启动WDT
                WDFEED = 0x55;    
            }

            void WDT_CLEAR(void)
            {
                IRQDisable();                    //喂狗之前关中断
                WDFEED = 0xAA;                //第一次喂狗启动WDT
                WDFEED = 0x55;    
                IRQEnable();                    //喂狗之后IRQ中断使能
            }
            void __irq IRQ_UART0(void)                          //串口0接收中断
            {  
                  uint8 i;
                  if((U0IIR&0x0f)==0x04)
                rcv_new = 1;
                for(i=0;i<BufferSize;i++)
                {
                      Buffer1[i]=U0RBR;
                  }
                  VICVectAddr = 0x00;    
            }

            void UART_Init (void)
            {
                uint16 Fdiv;
                
                PINSEL0 = (PINSEL0 & 0xFFF0FFF0) | 0x05|(0x05<<16);    // 
            设置I/O连接到UART
                
                U0LCR = 0x83;                        // DLAB=1,允许设置波特率
                U1LCR = 0x83;
                
                Fdiv  = (Fpclk / 16) / UART_BPS0;    // 设置U0波特率
                U0DLM = Fdiv / 256;
                U0DLL = Fdiv % 256;
                U0LCR = 0x03;
                        
                /* 使能UART0中断 */
                VICIntSelect = 0x00000000;            // 设置所有的通道为IRQ中断
                VICVectCntl0 = 0x20 | 0x06;            // UART0分配到IRQ 
            slot0,即最高优先级
                VICVectAddr0 = (uint32)IRQ_UART0;    // 设置UART0向量地址
                VICIntEnable = 1 << 0x06;            // 使能UART0中断

            }

            void UART0_SendByte (uint8 data)          //串口0发送数据
            {
                U0THR = data;
                
                while ((U0LSR & 0x40) == 0);    // 等待数据发送完毕
            }

            void UART0_SendBuf ( char *str)          //串口0发送字符串
            {
                
                uint8 i;
                for(i=0;i<BufferSize;i++)
                UART0_SendByte(Buffer1[i]);            // 发送数据
                while((U0LSR&0x20) == 0);
            }
            //SPI中断服务函数
            void __irq SPI_IRQ(void)
            {
                uint32 tmp;
                
                volatile uint8     RcvData;                // 接收到的数据
                volatile uint8     RcvFlag;                // 接收到新数据标志

                  tmp = S0PSR;                            // 
            SPI读取数据寄存器之前,必须先读SPSR寄存器,清零SPIF位。
                  RcvData = S0PDR;          // 接收数据
                  RcvFlag = 0x01;                        // 接收到新数据
                  S0PINT  = 0x01;           // 清除标志位
                VICVectAddr = 0x00;
            } 

            void  MSPI_Init(void)
            {  
                PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;// 设置管脚连接SPI
                IO0DIR |= 0xd0;
                 S0PCCR     = 0x52;                        // 设置SPI时钟分频
                 S0PCR      = (0 << 3) |                // CPHA = 0, 数据在SCK 
            的第一个时钟沿采样
                           (0 << 4) |                // CPOL = 0, SCK 为高有效
                           (1 << 5) |                // MSTR = 1, SPI 处于主模式
                           (0 << 6) |                // LSBF = 0, SPI 数据传输MSB 
            (位7)在先
                           (0 << 7);                    // SPIE = 1, SPI 中断使能
                 
                 VICIntSelect = 0x00000000;                  // 设置所有中断为IRQ
                VICVectCntl0 = (0x20 | 10);                 // SPI中断为最高优先级
                VICVectAddr0 = (int32)SPI_IRQ;                // 设置中断向量地址
                VICIntEnable = (1 << 10);                   // 允许SPI中断

                   delay(10);
            }


            //SPI读写一体化函数
            uint8 nrf905_SpiRW(uint8 data) 
            {
                //uint8 temp;
                S0PINT = 0x01; // Clear SPI interrupt
                  S0PDR = data;
                 while( 0 == (S0PSR & 0x80));
                 return S0PDR;
            }

            void nrf905_SPISendStr (uint8 *str)          //SPI0发送字符串
            {
                while (1)
                {
                    if (*str == '\0')    break;        // 遇到结束符,退出
                    nrf905_SpiRW(*str++) ;            // 发送数据
                }
            }

            //测试:通过读配置,判断SPI操作是否正确
            void nrf905_SpiTest(void)
            {
                uint8 i;
                  IO0CLR |= nRF905_CSN;                  
                  nrf905_SpiRW(RC);  //读配置
                  for (i=0;i<10;i++)
                 { 
                    Buffer2[i]= nrf905_SpiRW(0);//read from nrf905

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -