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(); }
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; }
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 }
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(); }
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); }