Example #1
0
static void serial_received(struct serial *serial)
{
    dma_disable(DMA1, serial->channel);
    usart_tcie(serial->port->c_dev()->regs, 0);
    serial->dmaEvent = false;
    serial->txComplete = true;
    receiveMode(serial);
    serial->syncReadStart = syncReadTimer.getCount();
}
Example #2
0
void initSerial(struct serial *serial, int baudrate = DXL_DEFAULT_BAUDRATE)
{
    pinMode(serial->direction, OUTPUT);

    // Enabling serial port in receive mode
    serial->port->begin(baudrate);
    serial->port->c_dev()->regs->CR3 = USART_CR3_DMAT;
    
    // Entering receive mode
    receiveMode(serial);

    // Registering the serial port
    serials[serial->index] = serial;
}
Example #3
0
void sendSerialPacket(struct serial *serial, volatile struct dxl_packet *packet)
{
    // We have a packet for the serial bus
    // First, clear the serial input buffers
    serial->port->flush();

    // Writing the packet in the buffer
    int n = dxl_write_packet(packet, (ui8 *)serial->outputBuffer);

    // Go in transmit mode
    transmitMode(serial);

#if 1
    // Then runs the DMA transfer
    serial->txComplete = false;
    serial->dmaEvent = false;
    setupSerialDMA(serial, n);
    dma_tube_cfg(DMA1, serial->channel, &serial->tube_config);
    dma_set_priority(DMA1, serial->channel, DMA_PRIORITY_VERY_HIGH);
    if (serial->index == 1) dma_attach_interrupt(DMA1, serial->channel, DMAEvent1);
    if (serial->index == 2) dma_attach_interrupt(DMA1, serial->channel, DMAEvent2);
    if (serial->index == 3) dma_attach_interrupt(DMA1, serial->channel, DMAEvent3);
    usart_tcie(serial->port->c_dev()->regs, 1);
    dma_enable(DMA1, serial->channel);
    serial->packetSent = millis();
#else
    // Directly send the packet
    char buffer[1024];
    n = dxl_write_packet(packet, (ui8 *)buffer);
    for (int i=0; i<n; i++) {
        serial->port->write(buffer[i]);
    }
    serial->port->waitDataToBeSent();
    receiveMode(serial);
#endif
}
Example #4
0
void nRF905_init()
{
#ifdef ARDUINO
    pinMode(TRX_EN, OUTPUT);
    pinMode(PWR_MODE, OUTPUT);
    pinMode(TX_EN, OUTPUT);

#if NRF905_COLLISION_AVOID
    pinMode(CD, INPUT);
#endif

#if AM_IS_USED_HW
    pinMode(AM, INPUT);
#endif

#if !NRF905_DR_SW
    pinMode(DR, INPUT);
#endif

    digitalWrite(CSN, HIGH);
    pinMode(CSN, OUTPUT);

    SPI.begin();
    SPI.setClockDivider(SPI_CLOCK_DIV2);
#else
    TRX_EN_DDR |= _BV(TRX_EN_BIT);
    PWR_MODE_DDR |= _BV(PWR_MODE_BIT);
    TX_EN_DDR |= _BV(TX_EN_BIT);

#if NRF905_COLLISION_AVOID
    CD_DDR &= ~_BV(CD_BIT);
#endif

#if AM_IS_USED_HW
    AM_DDR &= ~_BV(AM_BIT);
#endif

#if !NRF905_DR_SW
    DR_DDR &= ~_BV(DR_BIT);
#endif

    spiDeselect();
    CSN_DDR |= _BV(CSN_BIT);

    spi_init();
#endif

    radio.state = NRF905_RADIO_STATE_IDLE;

    // Startup
    enableStandbyMode();
    receiveMode();
    nRF905_powerDown();
    _delay_ms(3);
    defaultConfig();

#if NRF905_INTERRUPTS
    // Set interrupts
    REG_EXTERNAL_INT_CTL |= BIT_EXTERNAL_INT_CTL;
    nRF905_interrupt_on();
#endif

    nRF905_powerUp();
}
Example #5
0
void nRF905_init()
{
#ifdef ARDUINO
	pinMode(TRX_EN, OUTPUT);
	pinMode(PWR_MODE, OUTPUT);
	pinMode(TX_EN, OUTPUT);
	pinMode(CD, INPUT);
#if !NRF905_AM_SW
	pinMode(AM, INPUT);
#endif
#if !NRF905_DR_SW
	pinMode(DR, INPUT);
#endif

	pinMode(CSN, OUTPUT);
	digitalWrite(CSN, HIGH);

	SPI.begin();
	SPI.setClockDivider(SPI_CLOCK_DIV2);
#else
	TRX_EN_DDR |= (1<<TRX_EN_BIT);
	PWR_MODE_DDR |= (1<<PWR_MODE_BIT);
	TX_EN_DDR |= (1<<TX_EN_BIT);

	CD_DDR &= ~(1<<CD_BIT);
#if !NRF905_AM_SW
	AM_DDR &= ~(1<<AM_BIT);
#endif
#if !NRF905_DR_SW
	DR_DDR &= ~(1<<DR_BIT);
#endif

	spi_init();
#endif

	// Set default values
	config.reg1 = 0x00;
	config.reg2 = (0xC7 | NRF905_CLK_FREQ);
	config.payloadSize = NRF905_MAX_PAYLOAD;

#if NRF905_INTERRUPTS
	memset((byte*)rxBuffer, 0, sizeof(rxBuffer));
	gotData = false;

	// Set interrupts
	REG_EXTERNAL_INT_CTL |= BIT_EXTERNAL_INT_CTL;
	NRF905_INT_ON();
#endif

	// Startup
	nRF905_powerUp();
	receiveMode();
	enableStandbyMode();

//	config();

	// 4 byte TX and RX addresses
	setConfigRegister(NRF905_CMD_W_CONFIG | NRF905_REG_ADDR_WIDTH, 0b01000100);

	// Default config
	nRF905_setFrequency(NRF905_BAND_433, 433200000);
	nRF905_setAutoRetransmit(NRF905_AUTO_RETRAN_DISABLE);
	nRF905_setLowRxPower(NRF905_LOW_RX_DISABLE);
	nRF905_setTransmitPower(NRF905_PWR_10);
	nRF905_setCRCMode(NRF905_CRC_MODE_16);
	nRF905_setCRC(NRF905_CRC_ENABLE);
	nRF905_setClockOut(NRF905_OUTCLK_DISABLE);
	nRF905_setClockOutFreq(NRF905_OUTCLK_500KHZ);
	nRF905_setPayloadSize(NRF905_MAX_PAYLOAD);
	nRF905_setTXAddress(0xE7E7E7E7);
	nRF905_setRXAddress(0xE7E7E7E7);
}