Przeglądaj źródła

remap UART, py test

Juraj Ďuďák 2 lat temu
rodzic
commit
a473107102
8 zmienionych plików z 240 dodań i 27 usunięć
  1. 3 3
      Core/Inc/main.h
  2. 1 1
      Core/Src/main.c
  3. 4 4
      Core/Src/stm32l0xx_hal_msp.c
  4. 1 1
      Modules/nbus
  5. 17 18
      baModule-slave.ioc
  6. 3 0
      test/.gitignore
  7. 41 0
      test/app.py
  8. 170 0
      test/comm.py

+ 3 - 3
Core/Inc/main.h

@@ -57,14 +57,14 @@ void Error_Handler(void);
 /* USER CODE END EFP */
 
 /* Private defines -----------------------------------------------------------*/
-#define VCP_TX_Pin GPIO_PIN_2
+#define VCP_TX_Pin GPIO_PIN_9
 #define VCP_TX_GPIO_Port GPIOA
+#define VCP_RX_Pin GPIO_PIN_10
+#define VCP_RX_GPIO_Port GPIOA
 #define TMS_Pin GPIO_PIN_13
 #define TMS_GPIO_Port GPIOA
 #define TCK_Pin GPIO_PIN_14
 #define TCK_GPIO_Port GPIOA
-#define VCP_RX_Pin GPIO_PIN_15
-#define VCP_RX_GPIO_Port GPIOA
 #define LD3_Pin GPIO_PIN_3
 #define LD3_GPIO_Port GPIOB
 

+ 1 - 1
Core/Src/main.c

@@ -313,7 +313,7 @@ static void MX_TIM22_Init(void)
   htim22.Instance = TIM22;
   htim22.Init.Prescaler = UART_TIMER_PRESCALER;
   htim22.Init.CounterMode = TIM_COUNTERMODE_UP;
-  htim22.Init.Period = UART_TIMER_COUNTER;
+  htim22.Init.Period = 65535;
   htim22.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
   htim22.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
   if (HAL_TIM_Base_Init(&htim22) != HAL_OK)

+ 4 - 4
Core/Src/stm32l0xx_hal_msp.c

@@ -219,8 +219,8 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
 
     __HAL_RCC_GPIOA_CLK_ENABLE();
     /**USART2 GPIO Configuration
-    PA2     ------> USART2_TX
-    PA15     ------> USART2_RX
+    PA9     ------> USART2_TX
+    PA10     ------> USART2_RX
     */
     GPIO_InitStruct.Pin = VCP_TX_Pin|VCP_RX_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -274,8 +274,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
     __HAL_RCC_USART2_CLK_DISABLE();
 
     /**USART2 GPIO Configuration
-    PA2     ------> USART2_TX
-    PA15     ------> USART2_RX
+    PA9     ------> USART2_TX
+    PA10     ------> USART2_RX
     */
     HAL_GPIO_DeInit(GPIOA, VCP_TX_Pin|VCP_RX_Pin);
 

+ 1 - 1
Modules/nbus

@@ -1 +1 @@
-Subproject commit de7658d78c1c493e36f87841da8e318ceb1c6dae
+Subproject commit e5055769bfc3eaf3e0d5059e7f7e446366b120a5

+ 17 - 18
baModule-slave.ioc

@@ -31,10 +31,10 @@ Mcu.Package=LQFP32
 Mcu.Pin0=PC14-OSC32_IN
 Mcu.Pin1=PC15-OSC32_OUT
 Mcu.Pin10=VP_TIM22_VS_ClockSourceINT
-Mcu.Pin2=PA2
-Mcu.Pin3=PA13
-Mcu.Pin4=PA14
-Mcu.Pin5=PA15
+Mcu.Pin2=PA9
+Mcu.Pin3=PA10
+Mcu.Pin4=PA13
+Mcu.Pin5=PA14
 Mcu.Pin6=PB3
 Mcu.Pin7=VP_RTC_VS_RTC_Activate
 Mcu.Pin8=VP_RTC_VS_RTC_Calendar
@@ -55,6 +55,11 @@ NVIC.SysTick_IRQn=true\:0\:0\:true\:false\:true\:true\:true\:false
 NVIC.TIM21_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
 NVIC.TIM22_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
 NVIC.USART2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
+PA10.GPIOParameters=GPIO_Label
+PA10.GPIO_Label=VCP_RX
+PA10.Locked=true
+PA10.Mode=Asynchronous
+PA10.Signal=USART2_RX
 PA13.GPIOParameters=GPIO_Label
 PA13.GPIO_Label=TMS
 PA13.Locked=true
@@ -65,16 +70,11 @@ PA14.GPIO_Label=TCK
 PA14.Locked=true
 PA14.Mode=Serial_Wire
 PA14.Signal=SYS_SWCLK
-PA15.GPIOParameters=GPIO_Label
-PA15.GPIO_Label=VCP_RX
-PA15.Locked=true
-PA15.Mode=Asynchronous
-PA15.Signal=USART2_RX
-PA2.GPIOParameters=GPIO_Label
-PA2.GPIO_Label=VCP_TX
-PA2.Locked=true
-PA2.Mode=Asynchronous
-PA2.Signal=USART2_TX
+PA9.GPIOParameters=GPIO_Label
+PA9.GPIO_Label=VCP_TX
+PA9.Locked=true
+PA9.Mode=Asynchronous
+PA9.Signal=USART2_TX
 PB3.GPIOParameters=GPIO_Label
 PB3.GPIO_Label=LD3 [Green]
 PB3.Locked=true
@@ -116,7 +116,7 @@ ProjectManager.ToolChainLocation=
 ProjectManager.UAScriptAfterPath=
 ProjectManager.UAScriptBeforePath=
 ProjectManager.UnderRoot=true
-ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART2_UART_Init-USART2-false-HAL-true,5-MX_TIM22_Init-TIM22-false-HAL-true,6-MX_TIM21_Init-TIM21-false-HAL-true
+ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART2_UART_Init-USART2-false-HAL-true,5-MX_TIM22_Init-TIM22-false-HAL-true,6-MX_TIM21_Init-TIM21-false-HAL-true,7-MX_RTC_Init-RTC-false-HAL-true
 RCC.48CLKFreq_Value=24000000
 RCC.AHBFreq_Value=32000000
 RCC.APB1Freq_Value=32000000
@@ -154,9 +154,8 @@ RCC.WatchDogFreq_Value=37000
 TIM21.IPParameters=Prescaler,Period
 TIM21.Period=100
 TIM21.Prescaler=32000
-TIM22.IPParameters=Prescaler,Period
-TIM22.IPParametersWithoutCheck=Prescaler,Period
-TIM22.Period=UART_TIMER_COUNTER
+TIM22.IPParameters=Prescaler
+TIM22.IPParametersWithoutCheck=Prescaler
 TIM22.Prescaler=UART_TIMER_PRESCALER
 USART2.BaudRate=UART_BAUDRATE
 USART2.IPParameters=VirtualMode-Asynchronous,BaudRate

+ 3 - 0
test/.gitignore

@@ -0,0 +1,3 @@
+/html/
+# Object files
+*.pyc

+ 41 - 0
test/app.py

@@ -0,0 +1,41 @@
+from comm import *
+
+
+class AppTest:
+    def __init__(self, adr_module, adr_sensor):
+        self.serial_port = SerialComm('/dev/ttyUSB0')
+        self.module = adr_module
+        self.sensor = adr_sensor
+
+    def finish(self):
+        self.serial_port.close()
+
+    def cmd_version(self):
+        resp = self.serial_port.request(self.module, 0, CMD_VERSION,[])
+        version = chr(resp[3])+chr(resp[4])+chr(resp[5])
+        print("Version: "+version)
+
+    def cmd_echo(self):
+        msg=[65,66,67,68,69,70]
+        resp = self.serial_port.request(self.module, 0, CMD_ECHO,msg)
+        echo = ""
+        for r in range(len(msg)):
+            echo = echo + chr(resp[3+r])
+        print("Echo:"+echo)
+
+    def cmd_set_param(self, param):        
+        resp = self.serial_port.request(self.module, self.sensor, (SET+CMD_PARAM),[])     
+
+    def cmd_get_param(self, param):        
+        resp = self.serial_port.request(self.module, self.sensor, (CMD_PARAM),[])     
+
+if __name__ == "__main__":
+    
+    app = AppTest(0x05, 0x0)
+    # app.cmd_version()
+    # app.cmd_version()
+    # app.cmd_echo()
+    app.cmd_set_param(5)
+    app.cmd_get_param(5)
+    app.finish()
+

+ 170 - 0
test/comm.py

@@ -0,0 +1,170 @@
+import serial
+import time
+import struct
+
+usleep = lambda x: time.sleep(x/1000000.0)
+
+SET = 0x20
+GET = 0x00
+
+MODULE_ADDR = 0x05
+
+
+CMD_VERSION = 0x00
+CMD_ECHO = 0x01
+CMD_PARAM = 0x04
+
+CMD_STOP = 0x08
+CMD_START = 0x0C
+CMD_SAMPLERATE = 0x10
+CMD_LOWPASSFIL = 0x14
+CMD_RANGE = 0x18
+CMD_SENSOR_CNT = 0x1C
+CMD_SLEEP = 0x20
+CMD_WAKEUP = 0x24
+CMD_CALIBRATE = 0x28
+CMD_RESET = 0x2C
+CMD_STORE = 0x30
+CMD_DATA = 0x34
+
+crc8x_table = [
+        0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D,
+        0x70,0x77,0x7E,0x79,0x6C,0x6B,0x62,0x65,0x48,0x4F,0x46,0x41,0x54,0x53,0x5A,0x5D,
+        0xE0,0xE7,0xEE,0xE9,0xFC,0xFB,0xF2,0xF5,0xD8,0xDF,0xD6,0xD1,0xC4,0xC3,0xCA,0xCD,
+        0x90,0x97,0x9E,0x99,0x8C,0x8B,0x82,0x85,0xA8,0xAF,0xA6,0xA1,0xB4,0xB3,0xBA,0xBD,
+        0xC7,0xC0,0xC9,0xCE,0xDB,0xDC,0xD5,0xD2,0xFF,0xF8,0xF1,0xF6,0xE3,0xE4,0xED,0xEA,
+        0xB7,0xB0,0xB9,0xBE,0xAB,0xAC,0xA5,0xA2,0x8F,0x88,0x81,0x86,0x93,0x94,0x9D,0x9A,
+        0x27,0x20,0x29,0x2E,0x3B,0x3C,0x35,0x32,0x1F,0x18,0x11,0x16,0x03,0x04,0x0D,0x0A,
+        0x57,0x50,0x59,0x5E,0x4B,0x4C,0x45,0x42,0x6F,0x68,0x61,0x66,0x73,0x74,0x7D,0x7A,
+        0x89,0x8E,0x87,0x80,0x95,0x92,0x9B,0x9C,0xB1,0xB6,0xBF,0xB8,0xAD,0xAA,0xA3,0xA4,
+        0xF9,0xFE,0xF7,0xF0,0xE5,0xE2,0xEB,0xEC,0xC1,0xC6,0xCF,0xC8,0xDD,0xDA,0xD3,0xD4,
+        0x69,0x6E,0x67,0x60,0x75,0x72,0x7B,0x7C,0x51,0x56,0x5F,0x58,0x4D,0x4A,0x43,0x44,
+        0x19,0x1E,0x17,0x10,0x05,0x02,0x0B,0x0C,0x21,0x26,0x2F,0x28,0x3D,0x3A,0x33,0x34,
+        0x4E,0x49,0x40,0x47,0x52,0x55,0x5C,0x5B,0x76,0x71,0x78,0x7F,0x6A,0x6D,0x64,0x63,
+        0x3E,0x39,0x30,0x37,0x22,0x25,0x2C,0x2B,0x06,0x01,0x08,0x0F,0x1A,0x1D,0x14,0x13,
+        0xAE,0xA9,0xA0,0xA7,0xB2,0xB5,0xBC,0xBB,0x96,0x91,0x98,0x9F,0x8A,0x8D,0x84,0x83,
+        0xDE,0xD9,0xD0,0xD7,0xC2,0xC5,0xCC,0xCB,0xE6,0xE1,0xE8,0xEF,0xFA,0xFD,0xF4,0xF3
+    ]
+
+
+def crc8(data):
+    crc = 0    
+    length = len(data)
+    if length ==0:
+        return 0xff
+    crc &= 0xff;
+    i = 0
+    while length>0:
+        crc = crc8x_table[crc ^ data[i]];
+        length=length-1
+        i=i+1
+    return crc;
+
+
+def local_logger(*message):
+    for i in range(len(message)):
+        print(message[i], end=" ")
+    print()
+
+
+class SerialComm:
+    def __init__(self, port_name):
+        self.port = serial.Serial(timeout=0.05)
+        if port_name != "":
+            self.port.port = port_name
+        else:
+            self.port.port = '/dev/ttyACM0'
+
+        self.port.parity = serial.PARITY_NONE
+        self.port.baudrate = 921600
+        self.comm_thread = None
+        self.callback = local_logger
+        self.measure_active = False
+        self.data_file = None
+
+    def open(self):
+        self.port.open()
+        self.port.flush()
+        self.callback('i', 0, 'Open communication port')
+
+    def close(self):
+        self.port.close()
+
+    def is_connected(self):
+        return self.port.is_open
+
+    def set_logger(self, callback):
+        self.callback = callback
+
+    def create_packet(self, start, data):
+        if len(data) > 0:
+            for c in data:
+                start.append(c)
+
+        if not self.port.is_open:
+            self.open()
+        self.port.flush()
+
+        start[0] = len(start)
+        crc_sum = crc8(start[1:])
+        
+        start.append(crc_sum)
+        return start
+
+    def wait_to_response(self, extra_delay):
+        communication_delay = 0.001
+        t0 = time.time()  # timeout for response
+        response_length = self.port.inWaiting()
+        timeout = 0.05
+        if extra_delay != 0:
+            timeout = 0.5
+        while response_length == 0:
+            time.sleep(communication_delay)
+            response_length = self.port.inWaiting()
+            if time.time() - t0 > timeout:
+                self.callback('d', 0, "SKIP response")
+                return 0
+        return 1
+
+    def receive_response(self):
+        data = []
+        response_l = self.port.read(1)
+        response = self.port.read(ord(response_l))
+
+        for bajt in response:
+            data.append(bajt)
+        self.callback('d', 0, "\tRS=>", data)
+        return data
+
+    def request(self, module, sensor, command, data, skip_check=False, long_answer=0):
+        m = self.create_packet([0, module, sensor, command], data)
+        self.callback('d', sensor, "\tRQ>", m)
+        # SEND THE REQUEST
+        # self.port.write(m)
+        self.port.write([m[0]]) # send legth of message
+        # usleep(5)
+        self.port.write(m[1:]) # send body of message
+
+#        if self.wait_to_response(long_answer) == 0:
+#            return []
+
+        data = self.receive_response()
+#        if not skip_check:
+#            self.check_respose(data)
+        return data
+
+    def read_bytes(self, num):
+        return self.port.read(num)
+
+    def prepare_read_data(self):
+        if not self.port.is_open:
+            self.open()
+        self.flush()
+
+def to_int16(bytes_data):
+    uint16 = bytes_data[0] * 256 + bytes_data[1]
+    if uint16 > 2 ** 15:
+        uint16 = uint16 - 2 ** 16
+    return uint16
+
+