Esempio n. 1
0
// ============================ 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);
}
Esempio n. 2
0
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;
}
Esempio n. 3
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();
}
Esempio n. 4
0
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;
}