123
Fork of LG by
Diff: DeviceUserPort.c
- Revision:
- 182:2bd8ec44998f
- Parent:
- 177:672ef279c8e0
- Child:
- 183:c7a9c309086c
--- a/DeviceUserPort.c Fri Jul 08 14:58:17 2016 +0000 +++ b/DeviceUserPort.c Sun Jul 10 05:35:08 2016 +0000 @@ -4,23 +4,34 @@ extern unsigned int SystemCoreClock1; void InitUserPortDefaultSettings(void) { - device.controller.uart[1].settings.baudRate = 38400; + device.user.port.settings.baud = 38400; } void InitUserPortState(void) { + device.user.port.state.baud = device.user.port.settings.baud; } void DeviceStartUserPort(void) { - uint32_t Fdiv; - uint32_t pclkdiv, pclk; - LPC_PINCON->PINSEL4 &= ~0x0000000F; LPC_PINCON->PINSEL4 |= 0x0000000A; //Enable RxD1 P2.1, TxD1 P2.0 - - //By default, the PCLKSELx value is zero, thus, the PCLK for all the peripherals is 1/4 of the SystemFrequency. - //Bit 8,9 are for UART1 - pclkdiv = (LPC_SC->PCLKSEL0 >> 8) & 0x03; + + userSetBaudRate(device.user.port.state.baud); + + device.controller.uart[1].state.FCR = 0x03; + LPC_UART1->FCR = device.controller.uart[1].state.FCR; //Enable and reset TX and RX FIFO. + + /* + //Uncomment to use interrupts + //NVIC_EnableIRQ(UART1_IRQn); + //LPC_UART1->IER = IER_RBR | IER_THRE | IER_RLS; //Enable UART1 interrupt + */ +} + +void userSetBaudRate(uint32_t baud) { + //Peripheral clock of UART1 + uint32_t pclkdiv = (LPC_SC->PCLKSEL0 >> 8) & 0x03; //Bits 8,9 are for UART1 + uint32_t pclk; switch ( pclkdiv ) { case 0x00: default: @@ -35,28 +46,27 @@ case 0x03: pclk = SystemCoreClock1/8; break; - } - + } + //Divider + uint32_t Fdiv = ( pclk / 16 ) / baud; + //Enable divider write device.controller.uart[1].state.LCR = 0x83; - LPC_UART1->LCR = device.controller.uart[1].state.LCR; //8 bits, no Parity, 1 Stop bit - - Fdiv = ( pclk / 16 ) / device.controller.uart[1].settings.baudRate; /*baud rate */ - + LPC_UART1->LCR = device.controller.uart[1].state.LCR; //8 bits, no Parity, 1 Stop bit + //Write divider hi byte device.controller.uart[1].state.DLM = Fdiv / 256; LPC_UART1->DLM = device.controller.uart[1].state.DLM; - + //Write divider lo byte device.controller.uart[1].state.DLL = Fdiv % 256; LPC_UART1->DLL = device.controller.uart[1].state.DLL; - + //Disable divider write device.controller.uart[1].state.LCR = 0x03; - LPC_UART1->LCR = device.controller.uart[1].state.LCR; //DLAB = 0 + LPC_UART1->LCR = device.controller.uart[1].state.LCR; //DLAB = 0 - device.controller.uart[1].state.FCR = 0x03; - LPC_UART1->FCR = device.controller.uart[1].state.FCR; //Enable and reset TX and RX FIFO. - - //Uncomment to use interrupts - //NVIC_EnableIRQ(UART1_IRQn); - //LPC_UART1->IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART1 interrupt */ + device.user.port.state.baud = baud; + + #ifdef DEBUG_USER_BAUD + sprintf(device.service.buffer, "userSetBaudRate(%06d)\r\n", baud); WriteConcole(); + #endif } void userReceive(void){ @@ -70,7 +80,9 @@ void userTransmit(void){ if (device.user.response.ready) { - if ((device.user.response.type == RESPONSE_DELAYED) && (!device.user.response.triggered)) return; + if (device.user.response.type == RESPONSE_DELAYED) { + if (!device.user.response.triggered) return; + } if (device.user.response.buffer.position < device.user.response.buffer.count) { if (LPC_UART1->LSR & 0x20) { @@ -79,7 +91,10 @@ if (device.user.response.buffer.position == device.user.response.buffer.count){ device.user.response.ready = 0; if (device.user.response.type == RESPONSE_PERIODIC) { - device.user.response.enabled = 1; //next response required + device.user.response.enabled = 1; //next response encoding required + } + if (device.user.response.type == RESPONSE_DELAYED) { + device.user.response.triggered = 0; //Clear transmission flag, wait next trigger event. Here ok - transmit response in multiple passes! } device.user.response.buffer.count = 0; device.user.response.buffer.position = 0; @@ -89,7 +104,29 @@ } } -//Not used +// +//Compatibility section +// +uint8_t var_SRgR(void) { + //SysRgR + // Unused 3 bits: => xxxxx000 + // Hardware: transmitter rate = receiver rate => xxxx1000 + // Sending response, so transmitter enabled, no case => 1xxx1000 + // Request received, so receiver enabled, no case => 11xx1000 + uint8_t res; + switch (device.user.port.state.baud) { + case 38400: res = 0xc8; break; //11001000 + case 115200: res = 0xd8; break; //11011000 + case 460800: res = 0xe8; break; //11101000 + case 921600: res = 0xf8; break; //11111000 + default: res = 0xc8; //11001000 - 38400 + } + return res; +} + +// +//Not used section +// Communication using interrupt /* #define IER_RBR 0x01 #define IER_THRE 0x02