From d6fe6fc4ddba160434178aa145f5a7c9d870ab64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergi=20Hern=C3=A1ndez?= <shernand@iri.upc.edu> Date: Mon, 31 Mar 2014 20:44:47 +0000 Subject: [PATCH] ADC module working. Solved a problem in the dynamixel slave module when there was no answer. It stopped working. Added an initial ram module. --- include/dynamixel_slave_uart_dma.h | 1 + include/ram.h | 6 ++++- src/adc_dma.c | 13 +++++---- src/bioloid_stm32.c | 42 +++++++----------------------- src/dynamixel_slave_uart_dma.c | 13 +++++++++ src/ram.c | 8 ++++++ 6 files changed, 43 insertions(+), 40 deletions(-) create mode 100644 src/ram.c diff --git a/include/dynamixel_slave_uart_dma.h b/include/dynamixel_slave_uart_dma.h index 706ca3b..65454dd 100644 --- a/include/dynamixel_slave_uart_dma.h +++ b/include/dynamixel_slave_uart_dma.h @@ -12,5 +12,6 @@ uint8_t dyn_slave_is_packet_ready(void); void dyn_slave_get_inst_packet(uint8_t *packet); void dyn_slave_send_status_packet(uint8_t error,uint8_t length, uint8_t *data); void dyn_slave_resend_status_packet(uint8_t *packet); +void dyn_slave_reset(void); #endif diff --git a/include/ram.h b/include/ram.h index 94a1512..126d156 100644 --- a/include/ram.h +++ b/include/ram.h @@ -1,6 +1,10 @@ #ifndef _RAM_H #define _RAM_H -uint8_t ram_data[256]; +#include "stm32f4xx.h" + +extern uint8_t ram_data[256]; + +void ram_init(void); #endif diff --git a/src/adc_dma.c b/src/adc_dma.c index eab7f26..19a70aa 100644 --- a/src/adc_dma.c +++ b/src/adc_dma.c @@ -1,4 +1,5 @@ #include "adc_dma.h" +#include "ram.h" #define ADC1_CH1 ADC_Channel_TempSensor #define ADC1_CH2 ADC_Channel_8 @@ -36,7 +37,8 @@ #define ADC_CCR_ADDRESS ((uint32_t)0x40012308) // private variables -uint8_t adc_data[16]; + +// interrupt handlers // public functions void adc_init(void) @@ -55,7 +57,7 @@ void adc_init(void) /* DMA Config */ DMA_InitStructure.DMA_Channel = DMA_Channel_0; - DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)adc_data; + DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ram_data[50]; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_CCR_ADDRESS; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = 4; @@ -87,7 +89,7 @@ void adc_init(void) /* ADC Common Init */ ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult; - ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; + ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure); @@ -139,8 +141,5 @@ void adc_init(void) uint16_t adc_get_temperature(void) { - uint16_t value; - - value=adc_data[0]+(adc_data[1]<<8); - return value; + return 0x0000; } diff --git a/src/bioloid_stm32.c b/src/bioloid_stm32.c index 4270dae..340a044 100644 --- a/src/bioloid_stm32.c +++ b/src/bioloid_stm32.c @@ -8,6 +8,8 @@ #include "eeprom.h" #include "imu_9dof_dma.h" #include "gpio.h" +#include "ram.h" +#include "adc_dma.h" uint8_t read_operation(uint8_t address, uint8_t length, uint8_t *data) { @@ -27,33 +29,18 @@ uint8_t read_operation(uint8_t address, uint8_t length, uint8_t *data) } else// RAM region { + for(i=0;i<length;i++) + data[i]=ram_data[address+i]; return DYN_NO_ERROR; } } -void test_gpio(void) -{ - gpio_toggle_led(NORTH_LED); -} - int32_t main(void) { uint8_t inst_packet[1024]; uint8_t status_packet[1024]; uint8_t data[1024],error; uint16_t address; - GPIO_InitTypeDef GPIO_InitStructure; - - /* GPIOD Periph clock enable */ - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); - - /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOD, &GPIO_InitStructure); /* initialize EEPROM */ EE_Init(); @@ -70,21 +57,10 @@ int32_t main(void) imu_init(); /* initialize the gpio */ gpio_init(); - - if(imu_accel_detect()) - GPIO_SetBits(GPIOD,GPIO_Pin_12); - else - GPIO_ResetBits(GPIOD,GPIO_Pin_12); - if(imu_gyro_detect()) - GPIO_SetBits(GPIOD,GPIO_Pin_13); - else - GPIO_ResetBits(GPIOD,GPIO_Pin_13); - if(imu_compass_detect()) - GPIO_SetBits(GPIOD,GPIO_Pin_14); - else - GPIO_ResetBits(GPIOD,GPIO_Pin_14); - - gpio_set_pushbutton_callback(NORTH_PB,test_gpio); + // initialize the Dynamixel RAM memory space + ram_init(); + // initialize the Analog to digital converter + adc_init(); while(1) /* main function does not return */ { @@ -122,6 +98,8 @@ int32_t main(void) // send the answer back to the computer dyn_slave_resend_status_packet(status_packet); } + else + dyn_slave_reset();// prepare the dynamixel master to accept data } } else diff --git a/src/dynamixel_slave_uart_dma.c b/src/dynamixel_slave_uart_dma.c index 8b981fd..a32011a 100644 --- a/src/dynamixel_slave_uart_dma.c +++ b/src/dynamixel_slave_uart_dma.c @@ -288,3 +288,16 @@ void dyn_slave_resend_status_packet(uint8_t *packet) USART_DMACmd(DYN_SLAVE, USART_DMAReq_Tx, ENABLE); dyn_slave_sending_packet=0x01; } + +void dyn_slave_reset(void) +{ + dyn_slave_sending_packet=0x00; + // set up the DMA RX transaction + DYN_SLAVE_DMA_RX_InitStructure.DMA_BufferSize = 4; + DYN_SLAVE_DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dyn_slave_rx_buffer; + DMA_Init(DYN_SLAVE_RX_DMA_STREAM,&DYN_SLAVE_DMA_RX_InitStructure); + DMA_ITConfig(DYN_SLAVE_RX_DMA_STREAM,DMA_IT_TC,ENABLE); + DMA_Cmd(DYN_SLAVE_RX_DMA_STREAM,ENABLE); + USART_DMACmd(DYN_SLAVE, USART_DMAReq_Rx, ENABLE); + dyn_slave_receiving_header=0x01; +} diff --git a/src/ram.c b/src/ram.c new file mode 100644 index 0000000..860bea4 --- /dev/null +++ b/src/ram.c @@ -0,0 +1,8 @@ +#include "ram.h" + +uint8_t ram_data[256]; + +void ram_init(void) +{ + // read contents from EEPROM to RAM +} -- GitLab