diff --git a/servo_firmware/mx28/Makefile b/servo_firmware/mx28/Makefile
index 46a4876e8c007984a86221061468a300df498631..027265d40e07e85980082634a6d22e3b90a4e762 100755
--- a/servo_firmware/mx28/Makefile
+++ b/servo_firmware/mx28/Makefile
@@ -47,7 +47,6 @@ MAIN_OBJS = \
  src/system_init.o \
  src/dynamixel.o \
  src/dynamixel_slave.o \
- src/dynamixel_master.o \
  src/mx28_fw.o \
  src/startup/startup_stm32f10x_hd.o \
 
diff --git a/servo_firmware/mx28/include/dynamixel_master.h b/servo_firmware/mx28/include/dynamixel_master.h
deleted file mode 100755
index 7689b09d026cc4faec7b9da589c298cda5ac48fd..0000000000000000000000000000000000000000
--- a/servo_firmware/mx28/include/dynamixel_master.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef _DYNAMIXEL_MASTER_H
-#define _DYNAMIXEL_MASTER_H
-
-#include "dynamixel.h"
-
-// interrupt handlers
-void USART1_IRQHandler(void);
-
-// dynamixel master functions
-void dyn_master_init(void);
-void dyn_master_flush(void);
-void dyn_master_power_on(void);
-void dyn_master_power_off(void);
-uint8_t dyn_master_is_powered_on(void);
-void dyn_master_set_timeout(uint16_t timeout_ms);
-void dyn_master_scan(uint8_t *num,uint8_t *ids);
-uint8_t dyn_master_ping(uint8_t id);
-uint8_t dyn_master_read_byte(uint8_t id,uint8_t address,uint8_t *data);
-uint8_t dyn_master_read_word(uint8_t id,uint8_t address,uint16_t *data);
-uint8_t dyn_master_read_table(uint8_t id,uint8_t address,uint8_t length,uint8_t *data);
-uint8_t dyn_master_write_byte(uint8_t id, uint8_t address, uint8_t data);
-uint8_t dyn_master_write_word(uint8_t id, uint8_t address, uint16_t data);
-uint8_t dyn_master_write_table(uint8_t id, uint8_t address, uint8_t length, uint8_t *data);
-uint8_t dyn_master_reg_write(uint8_t id, uint8_t address, uint8_t length, uint8_t *data);
-void dyn_master_action(void);
-void dyn_master_sync_write(uint8_t num,uint8_t *ids,uint8_t address, uint8_t length, uint8_t *data);
-uint8_t dyn_master_reset(uint8_t id);
-// repeater functions
-uint8_t dyn_master_resend_inst_packet(uint8_t *inst_packet, uint8_t *status_packet);
-
-#endif
diff --git a/servo_firmware/mx28/include/dynamixel_slave.h b/servo_firmware/mx28/include/dynamixel_slave.h
index d03993d0ed9845ef130d8276e8dbc61041c452ed..b66de314ba1e5c5ba85d5bcebf579e4a631a30b6 100755
--- a/servo_firmware/mx28/include/dynamixel_slave.h
+++ b/servo_firmware/mx28/include/dynamixel_slave.h
@@ -4,11 +4,10 @@
 #include "dynamixel.h"
 
 // interrupt handlers
-void USART3_IRQHandler(void);
+void USART1_IRQHandler(void);
 
 // public functions
 void dyn_slave_init(void);
-uint8_t dyn_slave_pc_present(void);
 void dyn_slave_set_address(uint8_t id);
 uint8_t dyn_slave_get_address(void);
 uint8_t dyn_slave_is_packet_ready(void);
diff --git a/servo_firmware/mx28/src/dynamixel_master.c b/servo_firmware/mx28/src/dynamixel_master.c
deleted file mode 100755
index d5f5072d1b874a2a077491c650d44c9538d97cae..0000000000000000000000000000000000000000
--- a/servo_firmware/mx28/src/dynamixel_master.c
+++ /dev/null
@@ -1,451 +0,0 @@
-#include "dynamixel_master.h"
-#include "ram.h"
-#include "time.h"
-
-#define     PIN_USART1_TX            GPIO_Pin_6
-#define     PIN_USART1_RX            GPIO_Pin_7
-#define     PIN_ENABLE_TXD           GPIO_Pin_4
-#define     PIN_ENABLE_RXD           GPIO_Pin_5
-#define     PIN_ENABLE_DXLPWR        GPIO_Pin_8
-#define     PORT_USART1_TX           GPIOB
-#define     PORT_USART1_RX           GPIOB
-#define     PORT_ENABLE_TXD          GPIOB
-#define     PORT_ENABLE_RXD          GPIOB
-#define     PORT_ENABLE_DXLPWR       GPIOB
-
-#define     MAX_BUFFER_LEN           1024
-
-// private variables
-uint16_t dyn_master_timeout;// answer reception timeout
-// input buffer
-uint8_t dyn_master_rx_buffer[MAX_BUFFER_LEN];
-uint16_t dyn_master_rx_num_data;
-// output buffer
-uint8_t dyn_master_tx_buffer[MAX_BUFFER_LEN];
-uint16_t dyn_master_tx_num_data;
-uint16_t dyn_master_tx_ptr;
-// instruction packet ready flag
-volatile uint8_t dyn_master_packet_ready;
-// sending status packet flag
-volatile uint8_t dyn_master_sending_packet;
-
-// private functions
-void dyn_parse_status_packet(void)
-{
-  if(dyn_master_rx_num_data>3)// the length byte has been received
-  {
-    if(dyn_master_rx_num_data==(dyn_get_length(dyn_master_rx_buffer)+4))
-      dyn_master_packet_ready=0x01;
-  }  
-}
-
-void dyn_master_send(void)
-{
-  // wait until any previous transmission ends
-  while(dyn_master_sending_packet);
-  // send the first byte
-  dyn_master_tx_num_data=dyn_get_length(dyn_master_tx_buffer)+4;
-  dyn_master_sending_packet=0x01;
-  USART_ITConfig(USART1, USART_IT_TC, ENABLE);
-}
-
-uint8_t dyn_master_receive(void)
-{
-  int16_t timeout_left=dyn_master_timeout;
-
-  // wait for the status packet
-  while(!dyn_master_packet_ready)
-  {
-    delay_ms(10);
-    timeout_left-=10;
-    if(timeout_left<=0)
-      return DYN_TIMEOUT; 
-  }
-  dyn_master_packet_ready=0x00;
-  dyn_master_rx_num_data=0x00;
-  // check the input packet checksum
-  if(dyn_check_checksum(dyn_master_rx_buffer)==0xFF)
-    return dyn_get_status_error(dyn_master_rx_buffer);
-  else
-    return DYN_CHECKSUM_ERROR;
-}
-
-void dyn_master_enable_tx(void)
-{
-  GPIO_ResetBits(PORT_ENABLE_RXD, PIN_ENABLE_RXD);
-  GPIO_SetBits(PORT_ENABLE_TXD, PIN_ENABLE_TXD);
-}
-
-void dyn_master_enable_rx(void)
-{
-  GPIO_ResetBits(PORT_ENABLE_TXD, PIN_ENABLE_TXD);
-  GPIO_SetBits(PORT_ENABLE_RXD, PIN_ENABLE_RXD);
-}
-
-uint8_t dyn_master_read(uint8_t id,uint8_t address,uint8_t length,uint8_t *data)
-{
-  uint8_t error;
-
-  // generate the read packet for the desired device
-  dyn_init_instruction_packet(dyn_master_tx_buffer);
-  // set the ping instruction
-  dyn_set_instruction(dyn_master_tx_buffer,DYN_READ);
-  // set the device id
-  if((error=dyn_set_id(dyn_master_tx_buffer,id))==DYN_SUCCESS)
-  {
-    // set the length to read
-    dyn_set_read_length(dyn_master_tx_buffer,length);
-    // sert the start address to start reading
-    dyn_set_read_address(dyn_master_tx_buffer,address);
-    // set the checksum
-    dyn_set_checksum(dyn_master_tx_buffer);
-    // enable transmission
-    dyn_master_enable_tx();
-    // send the data
-    dyn_master_send();
-    // wait for the transmission to end
-    while(dyn_master_sending_packet);
-    dyn_master_enable_rx();
-    // wait for the replay within the given timeout
-    error=dyn_master_receive();
-    if(error==DYN_NO_ERROR)
-    {
-      // read the data from the status packet
-      dyn_get_status_data(dyn_master_rx_buffer,data);
-    }
-    return error;
-  }
-  else
-    return error;
-}
-
-uint8_t dyn_master_write(uint8_t id, uint8_t address, uint8_t length, uint8_t *data)
-{
-  uint8_t error;
-  
-  // generate the read packet for the desired device
-  dyn_init_instruction_packet(dyn_master_tx_buffer);
-  // set the ping instruction
-  dyn_set_instruction(dyn_master_tx_buffer,DYN_WRITE);
-  // set the device id
-  if((error=dyn_set_id(dyn_master_tx_buffer,id))==DYN_SUCCESS)
-  {
-    // sert the start address to start reading
-    dyn_set_read_address(dyn_master_tx_buffer,address);
-    // set the data to write and its length 
-    dyn_set_write_data(dyn_master_tx_buffer,length,data);
-    // set the checksum
-    dyn_set_checksum(dyn_master_tx_buffer);
-    // enable transmission
-    dyn_master_enable_tx();
-    // send the data
-    dyn_master_send();
-    // wait for the transmission to end
-    while(dyn_master_sending_packet);
-    dyn_master_enable_rx();
-    // wait for the replay within the given timeout
-    error=dyn_master_receive();
-    return error;
-  }   
-  else
-    return error;
-}
-
-// interrupt handlers
-/**
-  * @brief  This function handles USART1 global interrupt request.
-  * @param  None
-  * @retval None
-  */
-void USART1_IRQHandler(void)
-{
-  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
-  {
-    /* Read one byte from the receive data register */
-    dyn_master_rx_buffer[dyn_master_rx_num_data++] = USART_ReceiveData(USART1);
-    dyn_parse_status_packet();
-  }
-
-  if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
-  {
-    if(dyn_master_tx_num_data==0x00)// there is no more data to be sent
-    {
-      dyn_master_tx_ptr=0x00;
-      dyn_master_sending_packet=0x00;
-      // disable interrupts
-      USART_ITConfig(USART1, USART_IT_TC, DISABLE);
-    }
-    else// there is still data to be sent
-    {
-      dyn_master_tx_num_data--;
-      USART_SendData(USART1,dyn_master_tx_buffer[dyn_master_tx_ptr++]);// send the next_byte
-    }
-  }
-}
-
-// dynamixel master functions
-void dyn_master_init(void)
-{
-  uint16_t i;
-  GPIO_InitTypeDef GPIO_InitStructure;
-  NVIC_InitTypeDef NVIC_InitStructure;
-  USART_InitTypeDef USART_InitStructure;
-
-  // configure the GPIO pins
-  /* Enable the USART1 Pins Software Remapping */
-  GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
-
-  /* Configure USART1 Rx as input floating */
-  GPIO_InitStructure.GPIO_Pin = PIN_USART1_RX;
-  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
-  GPIO_Init(PORT_USART1_RX, &GPIO_InitStructure);
-
-  /* Configure USART1 Tx as alternate function push-pull */
-  GPIO_InitStructure.GPIO_Pin = PIN_USART1_TX;
-  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-  GPIO_Init(PORT_USART1_TX, &GPIO_InitStructure);
-
-  /* configure the control pins */
-  GPIO_InitStructure.GPIO_Pin = PIN_ENABLE_TXD | PIN_ENABLE_RXD | PIN_ENABLE_DXLPWR ;
-  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
-  GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-  dyn_master_enable_rx();
-
-  dyn_master_timeout=0x00;
-  ram_write_byte(CM730_DXL_POWER,0x00);
-  // initialize the buffers
-  for(i=0;i<MAX_BUFFER_LEN;i++)
-  {
-    dyn_master_rx_buffer[i]=0x00;
-    dyn_master_tx_buffer[i]=0x00;
-  }
-  dyn_master_rx_num_data=0x00;
-  dyn_master_tx_num_data=0x00;
-  dyn_master_tx_ptr=0x00;
-  // initialize the flags
-  dyn_master_packet_ready=0x00;
-  dyn_master_sending_packet=0x00;
-
-  USART_DeInit(USART1);
-  USART_StructInit(&USART_InitStructure);
-  // configure the serial port
-  USART_InitStructure.USART_BaudRate = 1000000;
-  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
-  USART_InitStructure.USART_StopBits = USART_StopBits_1;
-  USART_InitStructure.USART_Parity = USART_Parity_No;
-  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
-  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
-  USART_Init(USART1, &USART_InitStructure);
-
-  // configure the interrupts
-  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
-  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
-  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
-  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-  NVIC_Init(&NVIC_InitStructure);
-
-  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
-  USART_ITConfig(USART1, USART_IT_ORE, DISABLE);
-  USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
-  USART_ITConfig(USART1, USART_IT_TC, ENABLE);
-  USART_ITConfig(USART1, USART_IT_CTS, DISABLE);
-  USART_ITConfig(USART1, USART_IT_LBD, DISABLE);
-  USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);
-  USART_ITConfig(USART1, USART_IT_PE, DISABLE);
-  USART_ITConfig(USART1, USART_IT_ERR, DISABLE);
-
-  /* Enable the USART1 */
-  USART_Cmd(USART1, ENABLE);
-}
-
-void dyn_master_flush(void)
-{
-  // flush only the reception buffer to avoid interrupting a sync_write command
-  dyn_master_rx_num_data=0x00;
-//  dyn_master_tx_num_data=0x00;
-//  dyn_master_tx_ptr=0x00;
-  // initialize the flags
-  dyn_master_packet_ready=0x00;
-//  dyn_master_sending_packet=0x00;
-}
-
-void dyn_master_power_on(void)
-{
-  GPIO_SetBits(PORT_ENABLE_DXLPWR, PIN_ENABLE_DXLPWR);
-  ram_write_byte(CM730_DXL_POWER,0x01);
-}
-
-void dyn_master_power_off(void)
-{
-  GPIO_ResetBits(PORT_ENABLE_DXLPWR, PIN_ENABLE_DXLPWR);
-  ram_write_byte(CM730_DXL_POWER,0x00);
-}
-
-uint8_t dyn_master_is_powered_on(void)
-{
-  uint8_t power;
-
-  ram_read_byte(CM730_DXL_POWER,&power);
-  return power;
-}
-
-void dyn_master_set_timeout(uint16_t timeout_ms)
-{
-  // save the desired timeout value
-  dyn_master_timeout=timeout_ms;
-}
-
-void dyn_master_scan(uint8_t *num,uint8_t *ids)
-{
-  uint8_t i;
-
-  *num=0;
-  for(i=0;i<30;i++)
-  {
-    if(dyn_master_ping(i)==DYN_NO_ERROR)// the device exists
-    {
-      ids[*num]=i;
-      (*num)++;
-    }
-  }
-}
-
-uint8_t dyn_master_ping(uint8_t id)
-{
-  uint8_t error;
-
-  // generate the ping packet for the desired device
-  dyn_init_instruction_packet(dyn_master_tx_buffer);
-  // set the ping instruction
-  dyn_set_instruction(dyn_master_tx_buffer,DYN_PING);
-  // set the device id
-  if((error=dyn_set_id(dyn_master_tx_buffer,id))==DYN_SUCCESS)
-  {
-    // set the checksum
-    dyn_set_checksum(dyn_master_tx_buffer);
-    // enable transmission
-    dyn_master_enable_tx();
-    // send the data
-    dyn_master_send();
-    // wait for the transmission to end
-    while(dyn_master_sending_packet);
-    dyn_master_enable_rx();
-    // wait for the replay within the given timeout
-    error=dyn_master_receive();
-    return error;
-  }
-  else 
-    return error;
-}
-
-uint8_t dyn_master_read_byte(uint8_t id,uint8_t address,uint8_t *data)
-{
-  return dyn_master_read(id,address,1,data);
-}
-
-uint8_t dyn_master_read_word(uint8_t id,uint8_t address,uint16_t *data)
-{
-  uint8_t value[2];
-  uint8_t error;
-
-  error=dyn_master_read(id,address,2,value);
-  if(error==DYN_NO_ERROR)
-    (*data)=value[0]+value[1]*256;
-
-  return error;
-}
-
-uint8_t dyn_master_read_table(uint8_t id,uint8_t address,uint8_t length,uint8_t *data)
-{
-  return dyn_master_read(id,address,length,data);
-}
-
-uint8_t dyn_master_write_byte(uint8_t id, uint8_t address, uint8_t data)
-{
-  return dyn_master_write(id,address,1,&data);
-}
-
-uint8_t dyn_master_write_word(uint8_t id, uint8_t address, uint16_t data)
-{
-  uint8_t value[2];
-  
-  value[0]=data%256;
-  value[1]=data/256;
-  return dyn_master_write(id,address,2,value);
-}
-
-uint8_t dyn_master_write_table(uint8_t id, uint8_t address, uint8_t length, uint8_t *data)
-{
-  return dyn_master_write(id,address,length,data);
-}
-
-uint8_t dyn_master_reg_write(uint8_t id, uint8_t address, uint8_t length, uint8_t *data)
-{
-  return DYN_SUCCESS;
-}
-
-void dyn_master_action(void)
-{
-
-}
-
-void dyn_master_sync_write(uint8_t num,uint8_t *ids,uint8_t address, uint8_t length, uint8_t *data)
-{
-  uint8_t i;
-
-  // generate the sync write packet 
-  dyn_init_instruction_packet(dyn_master_tx_buffer);
-  // set the ping instruction
-  dyn_set_instruction(dyn_master_tx_buffer,DYN_SYNC_WRITE);
-  // set the start address
-  dyn_set_write_address(dyn_master_tx_buffer,address);
-  // set the data length
-  dyn_set_sync_write_length(dyn_master_tx_buffer,length);
-  // load the data for each device
-  for(i=0;i<num;i++)
-    dyn_set_sync_write_data(dyn_master_tx_buffer,ids[i],&data[i*length]);
-  // set the checksum
-  dyn_set_checksum(dyn_master_tx_buffer);
-  // enable transmission
-  dyn_master_enable_tx();
-  // send the data
-  dyn_master_send();
-  // wait for the transmission to end
-//  while(dyn_master_sending_packet);
-}
-
-uint8_t dyn_master_reset(uint8_t id)
-{
-  return DYN_SUCCESS;
-}
-
-// repeater functions
-uint8_t dyn_master_resend_inst_packet(uint8_t *inst_packet, uint8_t *status_packet)
-{
-  uint8_t error;
-
-  // generate the read packet for the desired device
-  dyn_init_instruction_packet(dyn_master_tx_buffer);
-  // copy the contents of the instruction packet to the output buffer
-  dyn_copy_packet(inst_packet,dyn_master_tx_buffer);
-  // enable transmission
-  dyn_master_enable_tx();
-  // send the data
-  dyn_master_send();
-  // wait for the transmission to end
-  while(dyn_master_sending_packet);
-  dyn_master_enable_rx();
-  // wait for the replay within the given timeout
-  error=dyn_master_receive();
-  if(error!=DYN_TIMEOUT)
-  {
-    // copy the contents of the status of the packet to the output buffer
-    dyn_copy_packet(dyn_master_rx_buffer,status_packet);
-  }
-
-  return error;
-}
-
diff --git a/servo_firmware/mx28/src/dynamixel_slave.c b/servo_firmware/mx28/src/dynamixel_slave.c
index d204d28ff322f93c8f4e928654e4ecb4e63a3431..ddeecb1012b3dfcfabfdffb000a7be738cbbb09f 100755
--- a/servo_firmware/mx28/src/dynamixel_slave.c
+++ b/servo_firmware/mx28/src/dynamixel_slave.c
@@ -1,11 +1,13 @@
 #include "dynamixel_slave.h"
 
-#define     PIN_USART3_TX            GPIO_Pin_10
-#define     PIN_USART3_RX            GPIO_Pin_11
-#define     PIN_nSLEEP               GPIO_Pin_13
-#define     PORT_USART3_TX           GPIOB
-#define     PORT_USART3_RX           GPIOB
-#define     PORT_nSLEEP              GPIOA
+#define     PIN_USART1_TX            GPIO_Pin_6
+#define     PIN_USART1_RX            GPIO_Pin_7
+#define     PIN_TX_EN                GPIO_Pin_14
+#define     PIN_RX_EN                GPIO_Pin_15
+#define     PORT_USART1_TX           GPIOB
+#define     PORT_USART1_RX           GPIOB
+#define     PORT_TX_EN               GPIOA
+#define     PORT_RX_EN               GPIOA
 
 #define     MAX_BUFFER_LEN           1024
 
@@ -35,36 +37,48 @@ void dyn_parse_inst_packet(void)
 
 // interrupt handlers
 /**
-  * @brief  This function handles USART3 global interrupt request.
+  * @brief  This function handles USART1 global interrupt request.
   * @param  None
   * @retval None
   */
-void USART3_IRQHandler(void)
+void USART1_IRQHandler(void)
 {
-  if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)// a byte has been received
+  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)// a byte has been received
   {
     /* Read one byte from the receive data register */
-    dyn_slave_rx_buffer[dyn_slave_rx_num_data++] = USART_ReceiveData(USART3);
+    dyn_slave_rx_buffer[dyn_slave_rx_num_data++] = USART_ReceiveData(USART1);
     dyn_parse_inst_packet();    
   }
 
-  if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)// a byte has been send
+  if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)// a byte has been send
   {
     if(dyn_slave_tx_num_data==0x00)// there is no more data to be sent
     {
       dyn_slave_tx_ptr=0x00;
       dyn_slave_sending_packet=0x00; 
       // disable interrupts
-      USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
+      USART_ITConfig(USART1, USART_IT_TC, DISABLE);
     }
     else
     {
-      USART_SendData(USART3,dyn_slave_tx_buffer[dyn_slave_tx_ptr++]);// send the next_byte
+      USART_SendData(USART1,dyn_slave_tx_buffer[dyn_slave_tx_ptr++]);// send the next_byte
       dyn_slave_tx_num_data--;
     }
   }
 }
 
+void dyn_slave_enable_tx(void)
+{
+  GPIO_ResetBits(PORT_RX_EN, PIN_RX_EN);
+  GPIO_SetBits(PORT_TX_EN, PIN_TX_EN);
+}
+
+void dyn_slave_enable_rx(void)
+{
+  GPIO_ResetBits(PORT_TX_EN, PIN_TX_EN);
+  GPIO_SetBits(PORT_RX_EN, PIN_RX_EN);
+}
+
 // public functions
 void dyn_slave_init(void)
 {
@@ -87,30 +101,32 @@ void dyn_slave_init(void)
   dyn_slave_sending_packet=0x00;
 
   // configure the interrupts
-  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
+  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
   // configure the GPIO pins
   /* Configure USART1 Rx as input floating */
-  GPIO_InitStructure.GPIO_Pin = PIN_USART3_RX;
+  GPIO_InitStructure.GPIO_Pin = PIN_USART1_RX;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
-  GPIO_Init(PORT_USART3_RX, &GPIO_InitStructure);
+  GPIO_Init(PORT_USART1_RX, &GPIO_InitStructure);
 
   /* Configure USART1 Tx as alternate function push-pull */
-  GPIO_InitStructure.GPIO_Pin = PIN_USART3_TX;
+  GPIO_InitStructure.GPIO_Pin = PIN_USART1_TX;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-  GPIO_Init(PORT_USART3_TX, &GPIO_InitStructure);
+  GPIO_Init(PORT_USART1_TX, &GPIO_InitStructure);
   
   /* configure the nSLEEP input from the FTDI device*/
-  GPIO_InitStructure.GPIO_Pin = PIN_nSLEEP;
+  GPIO_InitStructure.GPIO_Pin = PIN_TX_EN | PIN_RX_EN;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
-  GPIO_Init(PORT_nSLEEP, &GPIO_InitStructure);
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+  GPIO_Init(GPIOB, &GPIO_InitStructure);
 
-  USART_DeInit(USART3);
+  dyn_slave_enable_rx();
+
+  USART_DeInit(USART1);
   USART_StructInit(&USART_InitStructure);
   // configure the serial port
   USART_InitStructure.USART_BaudRate = 1000000;
@@ -119,26 +135,21 @@ void dyn_slave_init(void)
   USART_InitStructure.USART_Parity = USART_Parity_No;
   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
-  USART_Init(USART3, &USART_InitStructure);
+  USART_Init(USART1, &USART_InitStructure);
 
   // enable the interrupts
-  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
-  USART_ITConfig(USART3, USART_IT_ORE, DISABLE);
-  USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
-  USART_ITConfig(USART3, USART_IT_TC, DISABLE);
-  USART_ITConfig(USART3, USART_IT_CTS, DISABLE);
-  USART_ITConfig(USART3, USART_IT_LBD, DISABLE);
-  USART_ITConfig(USART3, USART_IT_IDLE, DISABLE);
-  USART_ITConfig(USART3, USART_IT_PE, DISABLE);
-  USART_ITConfig(USART3, USART_IT_ERR, DISABLE);
-
-  /* Enable the USART3 */
-  USART_Cmd(USART3, ENABLE);
-}
-
-uint8_t dyn_slave_pc_present(void)
-{
-  return GPIO_ReadOutputDataBit(PORT_nSLEEP,PIN_nSLEEP);  
+  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
+  USART_ITConfig(USART1, USART_IT_ORE, DISABLE);
+  USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
+  USART_ITConfig(USART1, USART_IT_TC, ENABLE);
+  USART_ITConfig(USART1, USART_IT_CTS, DISABLE);
+  USART_ITConfig(USART1, USART_IT_LBD, DISABLE);
+  USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);
+  USART_ITConfig(USART1, USART_IT_PE, DISABLE);
+  USART_ITConfig(USART1, USART_IT_ERR, DISABLE);
+
+  /* Enable the USART1 */
+  USART_Cmd(USART1, ENABLE);
 }
 
 void dyn_slave_set_address(uint8_t id)
@@ -177,9 +188,12 @@ void dyn_slave_send_status_packet(uint8_t error,uint8_t length, uint8_t *data)
   dyn_set_status_data(dyn_slave_tx_buffer,length,data);
   dyn_set_checksum(dyn_slave_tx_buffer);
   // start sending the package
+  dyn_slave_enable_tx();
   dyn_slave_tx_num_data=dyn_get_length(dyn_slave_tx_buffer)+4;
   dyn_slave_sending_packet=0x01;
-  USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
+  USART_ITConfig(USART1, USART_IT_TC, ENABLE);
+  while(dyn_slave_sending_packet==0x01);
+  dyn_slave_enable_rx();
 }
 
 void dyn_slave_resend_status_packet(uint8_t *packet)
@@ -190,7 +204,10 @@ void dyn_slave_resend_status_packet(uint8_t *packet)
   dyn_init_status_packet(dyn_slave_tx_buffer);
   dyn_copy_packet(packet,dyn_slave_tx_buffer); 
   // start sending the package
+  dyn_slave_enable_tx();
   dyn_slave_tx_num_data=dyn_get_length(dyn_slave_tx_buffer)+4;
   dyn_slave_sending_packet=0x01;
-  USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
+  USART_ITConfig(USART1, USART_IT_TC, ENABLE);
+  while(dyn_slave_sending_packet==0x01);
+  dyn_slave_enable_rx();
 }
diff --git a/servo_firmware/mx28/src/mx28_fw.c b/servo_firmware/mx28/src/mx28_fw.c
index 7bd0745b2d70b095027e3c66588a223d3ad1ccfd..7e2db16b42de6d685d95fc8fc666e907b6e08e44 100755
--- a/servo_firmware/mx28/src/mx28_fw.c
+++ b/servo_firmware/mx28/src/mx28_fw.c
@@ -118,6 +118,7 @@ void process_packet(uint8_t *packet)
 int main(void)
 {
   uint8_t inst_packet[1024];
+  int blink_count=0;
 
   // initialize the general features of the system
   clocks_init();
@@ -144,12 +145,7 @@ int main(void)
   
   while(1)
   {
-
-    GPIO_ResetBits(GPIOA,GPIO_Pin_13); // LED ON
-      delay_ms(300);
-      GPIO_SetBits(GPIOA,GPIO_Pin_13);  // LED OFF
-      delay_ms(300);
-    /*if(dyn_slave_is_packet_ready())// check if a new instruction packet has been received
+    if(dyn_slave_is_packet_ready())// check if a new instruction packet has been received
     {
       dyn_slave_get_inst_packet(inst_packet);// get the received packet
       // check the packet checksum
@@ -170,13 +166,19 @@ int main(void)
         // send a checksum error answer
         dyn_slave_send_status_packet(DYN_CHECKSUM_ERROR,0,0x00);
       }
-    } */
-    /*else {
-      GPIO_ResetBits(GPIOA,GPIO_Pin_13);
-      delay_ms(300);
-      GPIO_SetBits(GPIOA,GPIO_Pin_13);
-      delay_ms(300);
-    }*/
+    } 
+    else {
+      blink_count++;
+      if(blink_count==300)
+      {
+        if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_13))
+          GPIO_ResetBits(GPIOA,GPIO_Pin_13);
+        else
+          GPIO_SetBits(GPIOA,GPIO_Pin_13);
+        blink_count=0;
+      }
+    }
+    delay_ms(1);
    // GPIO_SetBits(GPIOA,GPIO_Pin_13);  // LED OFF
   }
 }