123

Dependencies:   mbed

Fork of LG by igor Apu

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