// ============================ Implementation ================================= void Si_t::Init(SPI_TypeDef* ASPI, const SiBitrate_t ABitrate, const SiBand_t ABand) { GPIO_InitTypeDef GPIO_InitStructure; // ==== Variables init ==== NewPacketReceived = false; TX_Pkt.PacketID = 0; // ==== Hardware init ==== FSPI = ASPI; SPI_Setup(FSPI); if (FSPI == SPI1) { FGPIO = GPIOA; SDN = GPIO_Pin_0; // Shutdown pin NIRQ = GPIO_Pin_1; // IRQ pin NSEL = GPIO_Pin_8; // CS pin RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); } else if (FSPI == SPI2) { FGPIO = GPIOB; SDN = GPIO_Pin_11; NIRQ = GPIO_Pin_10; NSEL = GPIO_Pin_12; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); } // Configure SDN & NSEL as Push Pull outputs GPIO_InitStructure.GPIO_Pin = NSEL | SDN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(FGPIO, &GPIO_InitStructure); // Configure NIRQ as Pull-up input GPIO_InitStructure.GPIO_Pin = NIRQ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(FGPIO, &GPIO_InitStructure); // ==== Init registers ==== SwitchOn(); Delay.ms(27); // Wait at least 27ms before any initialization SPI commands are sent to the radio this->IRQsRead(); // Release nIRQ pin SetMode (SI_MODE_RESET);// Perform reset of all registers IRQWait(); // Wait for chip to become ready RF_Config(ABitrate, ABand); SetPower(7); // Maximum //SetPower(0); // Minimum IRQsSet(SI_IRQ1_NONE, SI_IRQ2_NONE); }
void Analog_Setup(const UINT32 busClk) { TSPISetup aSPISetup; aSPISetup.isMaster = bTRUE; // Master aSPISetup.activeLowClock = bFALSE; // High clock aSPISetup.evenEdgeClock = bTRUE; // Even aSPISetup.LSBFirst = bFALSE; // MSB aSPISetup.baudRate = 1000000; // 1 Mbit NbAnalogInputs.l = 2; NbAnalogOutputs.l = 2; Element = 0; SPI_Setup(&aSPISetup, busClk); // No selection PTH_PTH4 = 0; PTH_PTH5 = 0; PTH_PTH6 = 0; }
void main(void) { // Sets up Timer A, clocks and pauses the watchdog timer ARC_setup(); // Sets up peripherals for the ARCbus and initializes the tasking library. COMM I2C address as the argument initARCbus(BUS_ADDR_COMM); // Sets up the radios SPI SPI_Setup(); // Set up the GDO interrupts for the radios and also the output pins for PA switches, use with engineering board radio_interrupts(); Reset_Radio(CC1101); // Power up radio __delay_cycles(8000); Radio_Strobe(TI_CCxxx0_SIDLE, CC1101; // Initalize radio in Idle mode //Radio_Strobe(TI_CCxxx0_SRX, CC2500); // Initialize CC2500 in Rx mode Write_RF_Settings(CC1101); // Write RF settings to configure registers Radio_Write_Burst_Registers(TI_CCxxx0_PATABLE, paTable_CC1101, paTableLen, CC1101); // Write PATABLE for CC1101 //Radio_Write_Burst_Registers(TI_CCxxx0_PATABLE, paTable_CC2500, paTableLen, CC2500); // Write PATABLE for CC2500 // Ports used to control RF amplifiers P5SEL |= BIT6; P5DIR |= BIT6; //Set up LEDs 1-8 for testing P7DIR |= BIT0; P7DIR |= BIT1; P7DIR |= BIT2; P7DIR |= BIT3; P7OUT = 0; //Initialize UART init_UCA1_UART(); // Initalizes bus interface initARCbus(BUS_ADDR_COMM); //Initialize stacks memset(stack1,0xcd,sizeof(stack1)); //Write known values into stack stack1[0] = stack1[sizeof(stack1)/sizeof(stack1[0]) - 1] = 0xfeed; //Create marker values at beginning and end of stack //Initialize stacks memset(stack2,0xcd,sizeof(stack2)); //Write known values into stack stack2[0] = stack2[sizeof(stack2)/sizeof(stack2[0]) - 1] = 0xfeed; //Create marker values at beginning and end of stack //Create tasks ctl_task_run(&tasks[0],10,TXRX,NULL,"TXRX",sizeof(stack1)/sizeof(stack1[0]) - 2,stack1+1,0); ctl_task_run(&tasks[1],1,sub_events,NULL,"sub_events",sizeof(stack2)/sizeof(stack2[0]) - 2,stack2+1,0); data_length = 255; // RxBufferLen = sizeof(RxBuffer); // Length of packet to be received This does not work for some reason TxThrBytes = 30; RxThrBytes = 32; RxBufferLen = 258; temp_count1 = 0; temp_count2 = 0; state = 0; P2IFG = 0; // Clear flags end = 0; //printf("Radio State: %x \n\r", Radio_Read_Status(TI_CCxxx0_MARCSTATE,CC1101)); printf("Ready\r\n"); mainLoop(); }
uint8_t NRF24L01_Setup(uint8_t model, uint8_t channel) { GPIO_InitTypeDef GPIO_InitStructure; #if USE_SPI_n == 1 RCC->APB2ENR |= RCC_APB2Periph_GPIOB; #else RCC->APB2ENR |= RCC_APB2Periph_GPIOC | RCC_APB2ENR_AFIOEN; PWR_BackupAccessCmd(ENABLE);//允许修改RTC 和后备寄存器 RCC_LSEConfig(RCC_LSE_OFF);//关闭外部低速外部时钟信号功能 后,PC13 PC14 PC15 才可以当普通IO用。 PWR_BackupAccessCmd(DISABLE);//禁止修改后备寄存器 #endif /*配置NRF的CE引脚*/ GPIO_InitStructure.GPIO_Pin = NRF_CE_PIN; //ce GPIO_InitStructure.GPIO_Speed = NRF_CE_PORT_SPEED; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(NRF_CE_PORT, &GPIO_InitStructure); /*配置NRF的IRQ引脚*/ GPIO_InitStructure.GPIO_Pin = NRF_IRQN_PIN; GPIO_InitStructure.GPIO_Speed = NRF_IRQN_PORT_SPEED; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //上拉输入 GPIO_Init(NRF_IRQN_PORT, &GPIO_InitStructure); NRF_CE_L; SPI_Setup(); delay_ms(100); ///////////////////////////////////////////////////// uint8_t TX_ADDRESS[TX_ADR_WIDTH]= {0xE1,0xE2,0xE3,0xE4,0xE5}; //本地地址 uint8_t RX_ADDRESS[RX_ADR_WIDTH]= {0xE1,0xE2,0xE3,0xE4,0xE5}; //接收地址 NRF_SPI_WriteReg(NRF_W | SETUP_AW,RX_ADR_WIDTH-2); // 节点地址长度5 bytes NRF_SPI_WriteBuf(NRF_W | RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); // 写RX节点地址 NRF_SPI_WriteBuf(NRF_W | TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); // 写TX节点地址 NRF_SPI_WriteReg(NRF_W | EN_AA,0x01); // 使能通道0的自动应答 if(NRF_SPI_ReadReg(EN_AA) != 0x01) return 0xFF; // 判断设备未连接 NRF_SPI_WriteReg(NRF_W | EN_RXADDR,0x01); // 使能通道0的接收地址 NRF_SPI_WriteReg(NRF_W | SETUP_RETR,0x11); // 设置自动重发间隔时间:500us;最大自动重发次数1次 NRF_SPI_WriteReg(NRF_W | RF_CH,channel); // 设置RF通道为CHANAL NRF_SPI_WriteReg(NRF_W | RF_SETUP,0x0e); // 设置TX发射参数,-6db增益,2Mbps,低噪声增益开启 ///////////////////////////////////////////////////////// NRF_FlushBuffer(FLUSH_RX|FLUSH_TX); if(model == MODEL_ONLY_RX){ // RX NRF_SPI_WriteReg(NRF_W | RX_PW_P0,RX_PLOAD_WIDTH_MAX); // 选择通道0的有效数据宽度 NRF_SPI_WriteReg(NRF_W | CONFIG, 0x0f); // IRQ收发完成中断开启,16位CRC,主接收 }else if(model == MODEL_ONLY_TX){ // TX NRF_SPI_WriteReg(NRF_W | RX_PW_P0,RX_PLOAD_WIDTH_MAX); // 选择通道0的有效数据宽度 NRF_SPI_WriteReg(NRF_W | CONFIG, 0x0e); // IRQ收发完成中断开启,16位CRC,主发送 }else if(model == MODEL_PRIM_RX){ // 主RX 伪双工 NRF_SPI_WriteReg(NRF_W | DYNPD,0x01); NRF_SPI_WriteReg(NRF_W | FEATURE,0x07); if(NRF_SPI_ReadReg(FEATURE) == 0x00){ NRF_SPI_WriteReg(LOCK_UNLOCK,0x73); // 打开附加功能 NRF_SPI_WriteReg(NRF_W | DYNPD,0x01); NRF_SPI_WriteReg(NRF_W | FEATURE,0x07); } if(NRF_SPI_ReadReg(FEATURE) != 0x07) return 0xFE; // 判断模式是否支持 NRF_SPI_WriteReg(NRF_W | CONFIG, 0x0f); // IRQ收发完成中断开启,16位CRC,主接收 }else if(model == MODEL_PRIM_TX){ // 主TX 伪双工 NRF_SPI_WriteReg(NRF_W | DYNPD,0x01); NRF_SPI_WriteReg(NRF_W | FEATURE,0x07); if(NRF_SPI_ReadReg(FEATURE) == 0x00){ NRF_SPI_WriteReg(LOCK_UNLOCK,0x73); // 打开附加功能 NRF_SPI_WriteReg(NRF_W | DYNPD,0x01); NRF_SPI_WriteReg(NRF_W | FEATURE,0x07); } if(NRF_SPI_ReadReg(FEATURE) != 0x07) return 0xFE; // 判断模式是否支持 NRF_SPI_WriteReg(NRF_W | CONFIG, 0x0e); // IRQ收发完成中断开启,16位CRC,主发送 } __model = model; NRF_CE_H; // 开始收发数据 delay_ms(3); return 0x00; }