瀏覽代碼

Проверка работы DAC.

TelenkovDmitry 1 年之前
父節點
當前提交
540c5e93df

二進制
doc/DAC.pdf


+ 142 - 0
fw/modules/dac/dac_transport.c

@@ -0,0 +1,142 @@
+#include "at32f403a_407.h"
+#include "dac_transport.h"
+#include "FreeRTOS.h"
+#include "task.h"
+#include "misc.h"
+#include <stdio.h>
+#include <stdbool.h>
+
+
+#define DAC_SPI  SPI4
+
+
+// PE12 - CS_DAC1
+// PD1 - CS_DAC2
+// PD0 - CS_DAC3
+// PD3 - CS_DAC4
+void dac_gpio_init(void)
+{
+    gpio_init_type gpio_initstructure;
+    spi_init_type spi_init_struct;
+  
+    crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
+    crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE);
+    crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK, TRUE);
+    
+    gpio_pin_remap_config(SPI4_GMUX_0001, TRUE);
+  
+    // SCK
+    gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;  
+    gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;  
+    gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;  
+    gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
+    gpio_initstructure.gpio_pins           = GPIO_PINS_11;
+    gpio_init(GPIOE, &gpio_initstructure);
+    
+    // MOSI
+    gpio_initstructure.gpio_pull           = GPIO_PULL_UP;  
+    gpio_initstructure.gpio_mode           = GPIO_MODE_MUX; 
+    gpio_initstructure.gpio_pins           = GPIO_PINS_14;
+    gpio_init(GPIOE, &gpio_initstructure);
+     
+    // CS 
+    gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;  
+    gpio_initstructure.gpio_pull           = GPIO_PULL_UP;  
+    gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;  
+    gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
+    gpio_initstructure.gpio_pins           = GPIO_PINS_12;
+    gpio_init(GPIOE, &gpio_initstructure);
+    
+    gpio_initstructure.gpio_pins           = GPIO_PINS_0 | GPIO_PINS_1 | GPIO_PINS_3;
+    gpio_init(GPIOD, &gpio_initstructure);
+    
+    dac_cs(CH_DAC_1, false);
+    dac_cs(CH_DAC_2, false);
+    dac_cs(CH_DAC_3, false);
+    dac_cs(CH_DAC_4, false);
+    
+
+    crm_periph_clock_enable(CRM_SPI4_PERIPH_CLOCK, TRUE);
+    
+    spi_default_para_init(&spi_init_struct);
+    spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
+    spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
+    spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_2; //SPI_MCLK_DIV_2;
+    spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB; //SPI_FIRST_BIT_LSB; 
+    spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
+    spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_LOW; // SPI_CLOCK_POLARITY_HIGH;
+    spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
+    spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
+    
+    spi_init(DAC_SPI, &spi_init_struct);
+    
+    spi_enable(DAC_SPI, TRUE);
+}
+
+//
+void dac_test(DAC_CHANNEL ch, uint16_t val)
+{
+    uint8_t ret;
+    
+    dac_cs(ch, true);
+
+    while (spi_i2s_flag_get(DAC_SPI, SPI_I2S_TDBE_FLAG) == RESET);
+    DAC_SPI->dt = 0;
+    
+    while (spi_i2s_flag_get(DAC_SPI, SPI_I2S_TDBE_FLAG) == RESET);
+    DAC_SPI->dt = val >> 8;
+    
+    while (spi_i2s_flag_get(DAC_SPI, SPI_I2S_TDBE_FLAG) == RESET);
+    DAC_SPI->dt = val;
+ 
+    
+    dac_cs(ch, false);
+}
+
+//
+void dac_cs(DAC_CHANNEL ch, bool state)
+{
+    switch (ch)
+    {
+        case CH_DAC_1:
+            state == true ? gpio_bits_reset(GPIOE, GPIO_PINS_12) : gpio_bits_set(GPIOE, GPIO_PINS_12);
+        break;
+        
+        case CH_DAC_2:
+            state == true ? gpio_bits_reset(GPIOD, GPIO_PINS_1) : gpio_bits_set(GPIOD, GPIO_PINS_1);
+        break;
+        
+        case CH_DAC_3:
+            state == true ? gpio_bits_reset(GPIOD, GPIO_PINS_0) : gpio_bits_set(GPIOD, GPIO_PINS_0);
+        break;
+        
+        case CH_DAC_4:
+            state == true ? gpio_bits_reset(GPIOD, GPIO_PINS_3) : gpio_bits_set(GPIOD, GPIO_PINS_3);
+        break;
+        
+        default: break;
+    }
+}
+
+//
+void dac_task(void *params)
+{
+    for (;;)
+    {
+        vTaskDelay(3000);
+        dac_test(CH_DAC_1, 0);  
+        dac_test(CH_DAC_2, 0);  
+        dac_test(CH_DAC_3, 0);  
+        dac_test(CH_DAC_4, 0);  
+        vTaskDelay(3000);
+        dac_test(CH_DAC_1, 0x7EFF);  
+        dac_test(CH_DAC_2, 0x7EFF);  
+        dac_test(CH_DAC_3, 0x7EFF);  
+        dac_test(CH_DAC_4, 0x7EFF);  
+        vTaskDelay(3000);
+        dac_test(CH_DAC_1, 0xFFFF);  
+        dac_test(CH_DAC_2, 0xFFFF);  
+        dac_test(CH_DAC_3, 0xFFFF);  
+        dac_test(CH_DAC_4, 0xFFFF);  
+    }
+}

+ 29 - 0
fw/modules/dac/dac_transport.h

@@ -0,0 +1,29 @@
+#ifndef __DAC_TRANSPORT_H
+#define __DAC_TRANSPORT_H
+
+#include <stdbool.h>
+
+typedef enum
+{
+    CH_DAC_1 = 0,
+    CH_DAC_2,
+    CH_DAC_3,
+    CH_DAC_4,    
+    
+} DAC_CHANNEL;
+
+//
+void dac_gpio_init(void);
+
+//
+void dac_test(DAC_CHANNEL ch, uint16_t val);
+
+//
+void dac_cs(DAC_CHANNEL ch, bool state);
+
+//
+void dac_task(void *params);
+
+
+#endif  // __DAC_TRANSPORT_H
+

+ 33 - 31
fw/modules/misc/misc.h

@@ -1,31 +1,33 @@
-#ifndef __MISC_H
-#define __MISC_H
-
-#include "at32f403a_407.h"
-
-#define MB_RX_ENABLE gpio_bits_reset(GPIOD, GPIO_PINS_10)
-#define MB_TX_ENABLE gpio_bits_set(GPIOD, GPIO_PINS_10)
-
-//
-void modbus_tim_init(void);
-
-//
-void modbus_init(void);
-
-//
-void test_modbus_port_init(void);
-
-//
-void mb_tim_test(void);
-
-//
-void mb_test_gpio_init(void);
-
-//
-void pwm_test(void);
-
-//
-void pwm_gpio_config(void);
-
-#endif  // __MISC_H
-
+#ifndef __MISC_H
+#define __MISC_H
+
+#include "at32f403a_407.h"
+
+#define MB_RX_ENABLE gpio_bits_reset(GPIOD, GPIO_PINS_10)
+#define MB_TX_ENABLE gpio_bits_set(GPIOD, GPIO_PINS_10)
+
+//
+void modbus_tim_init(void);
+
+//
+void modbus_init(void);
+
+//
+void test_modbus_port_init(void);
+
+void nop(uint32_t cnt);
+
+//
+void mb_tim_test(void);
+
+//
+void mb_test_gpio_init(void);
+
+//
+void pwm_test(void);
+
+//
+void pwm_gpio_config(void);
+
+#endif  // __MISC_H
+

+ 22 - 1
fw/user/main.c

@@ -58,6 +58,8 @@ int main(void)
  
     //xTaskCreate(adc_task, "adc_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     
+    xTaskCreate(dac_task, "dac_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    
     taskEXIT_CRITICAL();
     
     vTaskStartScheduler();
@@ -145,12 +147,31 @@ void init_task(void *argument)
     //pwm_test(); // тесы PWM
     gpio_get_rev();
     
+// -------------------------------------------------------------------------- //    
+// Сдвиговые регистры и мультиплексоры    
     sh_init();
     
 // Тесты аналоговых входов    
     //ai_connect_test();
     //ai_mode_test();
-      
+    //ai_connect_channel(V_ISO);  
+    
+// -------------------------------------------------------------------------- //    
+// DAC    
+    dac_gpio_init();
+    //dac_test(CH_DAC_1, 0);  
+/*    
+    dac_test(CH_DAC_2, 10000);  
+    dac_test(CH_DAC_3, 10000);
+    dac_test(CH_DAC_4, 10000);  
+*/    
+/*    
+    dac_test(CH_DAC_1, 10000);  
+    dac_test(CH_DAC_2, 10000);  
+    dac_test(CH_DAC_3, 10000);
+    dac_test(CH_DAC_4, 10000);  
+*/    
+    
 // -------------------------------------------------------------------------- //    
 // RNDIS
     

+ 1 - 0
fw/user/main.h

@@ -33,6 +33,7 @@
 #include "adc_transport.h"
 #include "shift_reg.h"
 #include "analog_input.h"
+#include "dac_transport.h"
 #include <stdio.h>
 #include <stdbool.h>
 #include <string.h>

二進制
output/fw.bin


File diff suppressed because it is too large
+ 536 - 535
project/ewarm/iap/iap.dep


File diff suppressed because it is too large
+ 561 - 556
project/ewarm/module_universal_io.dep


+ 7 - 0
project/ewarm/module_universal_io.ewp

@@ -379,6 +379,7 @@
                     <state>$PROJ_DIR$\..\..\fw\modules\modbus</state>
                     <state>$PROJ_DIR$\..\..\fw\modules\settings</state>
                     <state>$PROJ_DIR$\..\..\fw\modules\adc</state>
+                    <state>$PROJ_DIR$\..\..\fw\modules\dac</state>
                     <state>$PROJ_DIR$\..\..\fw\modules\shift_reg</state>
                     <state>$PROJ_DIR$\..\..\fw\user</state>
                     <state>$PROJ_DIR$\..\..\libs\thirdparty\freertos\include</state>
@@ -2165,6 +2166,12 @@
                     <name>$PROJ_DIR$\..\..\fw\modules\adc\ms5192t.c</name>
                 </file>
             </group>
+            <group>
+                <name>dac</name>
+                <file>
+                    <name>$PROJ_DIR$\..\..\fw\modules\dac\dac_transport.c</name>
+                </file>
+            </group>
             <group>
                 <name>io</name>
                 <file>

+ 6 - 0
project/ewarm/module_universal_io.ewt

@@ -2382,6 +2382,12 @@
                     <name>$PROJ_DIR$\..\..\fw\modules\adc\ms5192t.c</name>
                 </file>
             </group>
+            <group>
+                <name>dac</name>
+                <file>
+                    <name>$PROJ_DIR$\..\..\fw\modules\dac\dac_transport.c</name>
+                </file>
+            </group>
             <group>
                 <name>io</name>
                 <file>

Some files were not shown because too many files changed in this diff