ZJ3024

    1. g2553与nrf24l01接收端总能检测到载波 1/2754 微控制器 MCU 2016-06-28
      我自己上个程序,万一程序的原因呢? spi24l01.h #include #define NRF24L01DIR                P1DIR #define NRF24L01REN                P1REN #define NRF24L01IE                P1IE #define NRF24L01IES                P1IES #define NRF24L01IFG                P1IFG #define MCU2NRF24L01        P1OUT #define NRF24L012MCU        P1IN #define CE                BIT5 #define CSN                BIT3 #define IRQ                BIT0 #define                OUTDIR        NRF24L01DIR |= CE + CSN #define                IRQ_H        MCU2NRF24L01 |= IRQ #define                IRQ_REN        NRF24L01REN |= IRQ #define                IRQ_IE        NRF24L01IE |= IRQ #define                IRQ_IES        NRF24L01IES |= IRQ #define                IRQ_IFG        NRF24L01IFG         &= ~IRQ #define                CE_H        MCU2NRF24L01 |= CE #define                CE_L        MCU2NRF24L01 &= ~CE #define                CSN_H        MCU2NRF24L01 |= CSN #define                CSN_L        MCU2NRF24L01 &= ~CSN /**********  NRF24L01寄存器操作命令  ***********/ #define R_REGISTER      0x00  //读配置寄存器,低5位为寄存器地址 #define W_REGISTER      0x20  //写配置寄存器,低5位为寄存器地址 #define R_RX_PAYLOAD    0x61  //读RX有效数据,1~32字节 #define W_TX_PAYLOAD    0xA0  //写TX有效数据,1~32字节 #define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用 #define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用 #define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送. #define NOP             0xFF  //空操作,可以用来读状态寄存器 /**********  NRF24L01寄存器地址   *************/ #define CONFIG          0x00  //配置寄存器地址 #define EN_AA           0x01  //使能自动应答功能 #define EN_RXADDR       0x02  //接收地址允许 #define SETUP_AW        0x03  //设置地址宽度(所有数据通道) #define SETUP_RETR      0x04  //建立自动重发 #define RF_CH           0x05  //RF通道 #define RF_SETUP        0x06  //RF寄存器 #define STATUS          0x07  //状态寄存器 #define OBSERVE_TX      0x08  // 发送检测寄存器 #define CD              0x09  // 载波检测寄存器 #define RX_ADDR_P0      0x0A  // 数据通道0接收地址 #define RX_ADDR_P1      0x0B  // 数据通道1接收地址 #define RX_ADDR_P2      0x0C  // 数据通道2接收地址 #define RX_ADDR_P3      0x0D  // 数据通道3接收地址 #define RX_ADDR_P4      0x0E  // 数据通道4接收地址 #define RX_ADDR_P5      0x0F  // 数据通道5接收地址 #define TX_ADDR         0x10  // 发送地址寄存器 #define RX_PW_P0        0x11  // 接收数据通道0有效数据宽度(1~32字节) #define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节) #define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节) #define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节) #define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节) #define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节) #define FIFO_STATUS     0x17  // FIFO状态寄存器 /******   STATUS寄存器bit位定义      *******/ #define MAX_RT                  0x10            //达到最大发送次数中断 #define TX_DS                   0x20            //数据发送完成中断 #define RX_DR                   0x40            //接收到数据中断 void init_hwspi(void); void init_nrf24l01_io(void); unsigned char SPI_RW(unsigned char Byte); unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value); unsigned char SPI_Read(unsigned char reg); unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes); unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes); 复制代码 spi24l01.c #include #include "spi24l01.h" void init_hwspi(void) {     //DataIn + DataOut + SerialClockOut     //UCA0SOMI+UCA0SIMO+UCA0CLK     P1SEL = BIT1 + BIT2 + BIT4;     P1SEL2 = BIT1 + BIT2 + BIT4;     //USCI复位状态。     UCA0CTL1 |= UCSWRST;     //USCI时钟源选择SMCLK     UCA0CTL1 |= UCSSEL_2;     //在第一个 UCLK 边沿上捕获的数据和在下列边沿上改变的数据,未激活的状态是低电平     //MSB优先+主控模式+3线SPI+同步模式     UCA0CTL0 |= UCCKPH + UCMSB + UCMST + UCMODE_0 + UCSYNC;     //设定波特率     UCA0BR0 = 2;     UCA0BR1 = 0;     //USCI复位操作释放     UCA0CTL1 &= ~UCSWRST;     //使能接收和发送中断 //    IE2 |= UCA0RXIE + UCA0TXIE; } void init_nrf24l01_io(void) {         OUTDIR; //        IRQ_H; //        IRQ_REN; //        IRQ_IE; //        IRQ_IES; //        IRQ_IFG;         P1OUT |= BIT0;         P1REN |= BIT0;         P1IE |= BIT0;         P1IES |= BIT0;         P1IFG =0; } //硬件SPI数据交换函数 //SPI_RW(待交换的数据) unsigned char SPI_RW(unsigned char byte) {         UCA0TXBUF = byte;         while((UCA0STAT&UCBUSY)>0);         return UCA0RXBUF; } //寄存器写值函数 //SPI_RW_Reg(访问地址,要设定的值) unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value) {         //设定状态值     unsigned char status;     // 拉低CSN,初始化SPI传输     CSN_L;     // 写入待访问的地址(写寄存器命令(0x20)+寄存器地址),同时读取状态值     status = SPI_RW(reg);     // 写入要设定的值     SPI_RW(value);     // 拉高CSN,结束SPI传输     CSN_H;     // 返回状态值     return (status); } //读取寄存器值的函数 //SPI_Read(要读取的寄存器地址) unsigned char SPI_Read(unsigned char reg) {         //设定读取到值     unsigned char reg_val;     // 拉低CSN,初始化SPI传输     CSN_L;     // 写入待访问的寄存器地址(读寄存器命令(0x00可省略)+寄存器地址),同时读取状态值     SPI_RW(reg);     //读取寄存器的值     reg_val = SPI_RW(0);     // 拉高CSN,结束SPI传输     CSN_H;     //返回读取到的寄存器的值     return (reg_val); } //读取多字节的数据(主要用来在接收时读取 FIFO 缓冲区中的值) //SPI_Read_Buf(待读寄存器地址,待读数据的存放地址(即存放读取数据的数组),数据的字节数) unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes) {         //设定状态值,当前字节数     unsigned char status, byte_ctr;     // 拉低CSN,初始化SPI传输     CSN_L;     // 写入待访问的地址(写寄存器命令(0x20)+寄存器地址),同时读取状态值     status = SPI_RW(reg);     //按照数据字节数读取每字节数据     for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)     {             //将读取到每字节数据存入对应的数据地址         pBuf[byte_ctr] = SPI_RW(0);     }     // 拉高CSN,结束SPI传输     CSN_H;     // 返回状态值     return (status); } //写入多字节的数据(主要用来把数组里的数放到发射 FIFO 缓冲区中) //SPI_Write_Buf(待写寄存器地址,待写数据的存放地址(即存放待写数据的数组),数据的字节数) unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes) {         //设定状态值,当前字节数     unsigned char status, byte_ctr;     // 拉低CSN,初始化SPI传输     CSN_L;     // 写入待访问的地址(写寄存器命令(0x20)+寄存器地址),同时读取状态值     status = SPI_RW(reg);     //按照数据字节数写入每字节数据     for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)     {             //写入当前地址的一字节数据,并移动到下一字节的地址             SPI_RW(*pBuf++);     }     // 拉高CSN,结束SPI传输     CSN_H;     // 返回状态值     return (status); } 复制代码 发送端 #include #include "spi24l01.h" unsigned char sta; unsigned char fifo_s; unsigned char flag,i,flag_rx=0; unsigned char addr[5]={0,0,0,0,0}; unsigned char TX[3]={1,2,3}; unsigned char RX[3]={0,0,0}; //有效数据宽度 #define PLOAD_WIDTH                3 //地址宽度 #define ADR_WIDTH                5 //发送地址&自动应答接收地址 unsigned char ADDR[ADR_WIDTH]={1,2,3,4,5}; void init_clock(void) {         // 检查校准信息是否被擦除         while(CALBC1_1MHZ==0xff||CALDCO_1MHZ==0XFF);         // 设置SELX的范围         DCOCTL=CALDCO_1MHZ;         // 设置SELX的范围         BCSCTL1=CALBC1_1MHZ;         //设置MCLK和SMCLK均为DCO_1MHz,8分频         BCSCTL2=DIVM_3+DIVS_3; } void delay_ms(unsigned int x) {   unsigned int i,j;   for (i=0;i
    2. 谢谢,在研究PID控制技术,希望可以借鉴
    3. MSP430G2553模拟IIC读取MPU6050, 7/5444 微控制器 MCU 2015-11-11
      借鉴学习

最近访客

< 1/1 >

统计信息

已有3人来访过

  • 芯积分:--
  • 好友:--
  • 主题:1
  • 回复:3

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言