David Giles
/
CM-MBED_RSEDP_Test_Suite_LPC1768_V3
This is a complete listing of the RS-EDP software for the mbed module to support the RS-EDP platform.
Diff: SourceFiles/RSEDP_Test.cpp
- Revision:
- 0:5b7639d1f2c4
diff -r 000000000000 -r 5b7639d1f2c4 SourceFiles/RSEDP_Test.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SourceFiles/RSEDP_Test.cpp Fri Nov 19 09:49:16 2010 +0000 @@ -0,0 +1,1393 @@ +/* Hardware Tests for RS-EDP Platform Using MBED Module */ +/* ************** */ + +/* Version 3.0 */ + + +/* This module is to test the hardware on the MCBSTR91x Module. */ + + +#include "mbed.h" /* Header file for mbed module */ +#include "misra_types.h" /* MISRA Types */ +#include "defines.h" /* User defines */ +#include "RSEDP_Slave_Address_Defines.h" /* Slave address of I2C Devices defined hhere */ + +#include "RSEDP_Mbed_Module.h" /* all the low level peripheral drivers on te mbed module - IO ports, UART, SPI, I2C etc */ +#include "RSEDP_Base_Board.h" /* All the base board functions - EEPROM and erial latch */ +#include "RSEDP_Comms_Module.h" /* Functions to control the real time clock */ +#include "RSEDP_Digital_IO_Module.h" /* All the functions to control the serial input and output latches */ +#include "RSEDP_Analogue_Module.h" /* Functions to control digital pot and serial ADC */ +#include "RSEDP_MC1.h" /* Brushed DC Motor Drive MC1 Module */ +#include "RSEDP_Test_MC2.h" + + + + +/* Global Function prototype Here */ +void RSEDP_test_all(void); + + +/* Local Menu functions */ +static void Test_Processor_Module_Menu(void); +static void Test_Base_Board_Menu(void); +static void Test_Comms_Module_Menu(void); +static void Test_Digital_IO_Module_Menu(void); +static void Test_Analogue_Module_Menu(void); +static void Test_MC1_Module_Menu(void); + +/*Processor Board Tests */ +static void test_mbed_LEDs(void); +static void test_mbed_UART0(void); +static void test_mbed_UART1(void); +static void test_mbed_CNTRL_I2C_Master_Mode(void); +static void test_mbed_CNTRL_SPI_Master_Mode(void); + +/* Base Board Tests */ +static void test_BB_24LC32(uint8_t Slave_Address); +static void test_BB_PCA9675(uint8_t Slave_Address); +static void test_BB_RESET_Button(void); + +/* Communication Board Tests */ +static void test_PCF8583(uint8_t Slave_Address); + +/* Digital I/O board Tests */ +static void test_digital_output_PCA9555(uint8_t Slave_Address); +static void test_digital_input_PCA9555(uint8_t Slave_Address); + +/* Analogue Module Tests */ +static void test_MAX1x3x(uint8_t Slave_Address); +static void test_AD5263(uint8_t Slave_Address); + +/* MC1 Tests */ +static void test_MC1_VDCLINK(void); +static void test_MC1_VSENSE(void); +static void test_MC1_Read_Encoders(void); +static void test_MC1_Brakes(void); +static void test_MC1_Set_Direction(void); +static void test_MC1_Speed_Ramp_UpDown(void); +static void test_MC1_Set_Speed_PWM_Duty(void); +static void test_MC1_Stop_Motor(void); + + +static void delay_ms(uint16_t time_delay); + + + + +/* Main Test Selection Menu */ +void RSEDP_test_all(void) + { + uint16_t keypress = 0u; + + while(1) + { + pc.printf("\n\n\rMain Top Level Test Menu\n\n\r"); + pc.printf("1. Processor Module Test\n\r"); + pc.printf("2. Base Board Tests\n\r"); + + if (COMMS_MODULE_FITTED == YES) + { + pc.printf("3. Communications Module Tests\n\r"); + } + if (DIGITAL_IO_MODULE_FITTED == YES) + { + pc.printf("4. Digital I/O Module Tests\n\r"); + } + if (ANALOGUE_MODULE_FITTED == YES) + { + pc.printf("5. Analogue Module Tests\n\r"); + } + if (MOTOR_MC1_MODULE_FITTED == YES) + { + pc.printf("6. Brushed DC Motor Drive MC1 Module Tests\n\r"); + } + if (MOTOR_MC2_MODULE_FITTED == YES) + { + pc.printf("7. Brushless DC Motor Drive MC2 Module Tests\n\r"); + } + pc.printf("\n\rPlease select one of the above tests\r\n"); + + keypress = pc.getc(); + + if (keypress == '1') Test_Processor_Module_Menu(); + if (keypress == '2') Test_Base_Board_Menu(); + if (COMMS_MODULE_FITTED == YES) + { + if (keypress == '3') Test_Comms_Module_Menu(); + } + if (DIGITAL_IO_MODULE_FITTED == YES) + { + if (keypress == '4') Test_Digital_IO_Module_Menu(); + } + if (ANALOGUE_MODULE_FITTED == YES) + { + if (keypress == '5') Test_Analogue_Module_Menu(); + } + if (MOTOR_MC1_MODULE_FITTED == YES) + { + if (keypress == '6') Test_MC1_Module_Menu(); + } + if (MOTOR_MC2_MODULE_FITTED == YES) + { + if (keypress == '7') I2C_MMSC_Test_Suite(); + } + + } + } + + +/* Test The Microprocessor Module */ +static void Test_Processor_Module_Menu(void) + { + uint16_t keypress=0; + + while(1) + { + pc.printf("\n\n\rProcessor Module Test Menu\n\n\r"); + pc.printf("1. LED Test\n\r"); + pc.printf("2. UART0 Test\n\r"); + pc.printf("3. UART1 Test\n\r"); + pc.printf("4. CNTRL I2C Master Mode Test\n\r"); + pc.printf("5. CNTRL SPI Master Mode Test\n\r"); + + pc.printf("\n\rPlease select one of the above tests\r\n"); + + keypress = pc.getc(); + + if (keypress=='1') test_mbed_LEDs(); + if (keypress=='2') test_mbed_UART0(); + if (keypress=='3') test_mbed_UART1(); + if (keypress=='4') test_mbed_CNTRL_I2C_Master_Mode(); + if (keypress=='5') test_mbed_CNTRL_SPI_Master_Mode(); + if (keypress=='\r') break; + + } + } + + +/* This is the menu for the Base Board Tests */ +static void Test_Base_Board_Menu(void) + { + uint16_t keypress = 0u; + + while(1) + { + pc.printf("\n\n\rBase Board Test Menu\n\n\r"); + pc.printf("1. DIP Switch via PCA9675 Serial Input Latch\n\r"); + pc.printf("2. 24LC32 Serial EEPROM Test\n\r"); + pc.printf("3. Reset Button Test\n\r"); + pc.printf("\n\rPlease select one of the above tests\r\n"); + + keypress = pc.getc(); + + if (keypress == '1') test_BB_PCA9675(PCA9675_BASE_BOARD); + if (keypress == '2') test_BB_24LC32(M24C32_BASE_BOARD); + if (keypress == '3') test_BB_RESET_Button(); + if (keypress == '\r') break; + } + } + +/* Test The Communications Module */ +static void Test_Comms_Module_Menu(void) + { + uint16_t keypress=0; + + while(1) + { + pc.printf("\n\n\rCommunications Module Test Menu\n\r"); + pc.printf("1 PCF8385 Real Time Clock Test\n\r"); +// pc.printf("2 CAN2.0B Test\n\r"); + pc.printf("\n\rPlease select one of the above tests\r\n"); + + keypress = pc.getc(); + + if (keypress=='1') test_PCF8583(PCF8583_COMMS_MODULE); +// if (keypress=='2') test_CAN(); + if (keypress=='\r') break; + } + } + +/* Test The Digital I/O Module */ +static void Test_Digital_IO_Module_Menu(void) + { + uint16_t keypress=0; + + while(1) + { + pc.printf("\n\n\rDigital I/O Module Test Menu\n\n\r"); + pc.printf("1. Serial Digital Output OUT_P0(x) & OUT_P1(x)\n\r"); + pc.printf("2. Serial Digital Input IN_P0(x) & IN_P1(x)\n\r"); + pc.printf("\n\rPlease select one of the above tests\r\n"); + + keypress = pc.getc(); + if (keypress == '1') test_digital_output_PCA9555(PCA9555_DIGITAL_IO_OUT); + if (keypress == '2') test_digital_input_PCA9555(PCA9555_DIGITAL_IO_IN); + if (keypress == '\r') break; + + } + } + + +/* Test The Analogue Module */ +static void Test_Analogue_Module_Menu(void) + { + uint16_t keypress=0; + + while(1) + { + pc.printf("\n\n\rAnalogue Module Test Menu\n\n\r"); + pc.printf("1. MAX1x38 I2C Serial A to D Converter\n\r"); /* Production 10 bit ADC option */ + pc.printf("2. AD5263 I2C Digital Potentiometer\n\r"); + pc.printf("\n\rPlease select one of the above tests\r\n"); + + keypress = pc.getc(); + + if (keypress == '1') test_MAX1x3x(MAX1X3X_ANALOGUE_ADC); + if (keypress == '2') test_AD5263(AD5263_ANALOGUE_DIGITAL_POT); + if (keypress == '\r') break; + + } + } + + +/* This is the menu for the Brushed DC Motor Control MC! Module Tests */ +static void Test_MC1_Module_Menu(void) + { + uint16_t keypress = 0u; + + while(1) + { + pc.printf("\n\n\rBrushed DC Motor Drive Module MC1 Test Menu\n\n\r"); + pc.printf("1. Read the VDCLINK Voltage\n\r"); + pc.printf("2. Read the VSENSE Voltage\n\r"); + pc.printf("3. Read the Encoder0 & Encoder 1 Input Signals\n\r"); + pc.printf("4 Test the Brake ON & OFF Signal\n\r"); + pc.printf("5 Set the direction of rotation\n\r"); + pc.printf("6 Ramp the Motor Speed PWM Duty Up & Down\n\r"); + pc.printf("7 Set the Motor PWM Duty\n\r"); + pc.printf("8 Stop the motor\n\r"); + + pc.printf("\n\rPlease select one of the above tests\r\n"); + + keypress = pc.getc(); + + if (keypress == '1') test_MC1_VDCLINK(); + if (keypress == '2') test_MC1_VSENSE(); + if (keypress == '3') test_MC1_Read_Encoders(); + if (keypress == '4') test_MC1_Brakes(); + if (keypress == '5') test_MC1_Set_Direction(); + if (keypress == '6') test_MC1_Speed_Ramp_UpDown(); + if (keypress == '7') test_MC1_Set_Speed_PWM_Duty(); + if (keypress == '8') test_MC1_Stop_Motor(); + if (keypress == '\r') break; + } + } + + + + + + + +/* Processor Board Tests Starts Here */ +/* LED Tests on the Processor Card */ +static void test_mbed_LEDs(void) + { + uint8_t n = 0; + + + pc.printf("\n\n\n\rTesting the LEDs on the mbed module...\n\n\r"); + for (n = 0; n < 5; n++) + { + User_Led1 = LED_ON; /* Flash the LED to signal the world the firmware is running */ + User_Led2 = LED_ON; /* Flash the LED to signal the world the firmware is running */ + User_Led3 = LED_ON; /* Flash the LED to signal the world the firmware is running */ + User_Led4 = LED_ON; /* Flash the LED to signal the world the firmware is running */ + wait(0.5); + + User_Led1 = LED_OFF; /* Flash the LED to signal the world the firmware is running */ + User_Led2 = LED_OFF; /* Flash the LED to signal the world the firmware is running */ + User_Led3 = LED_OFF; /* Flash the LED to signal the world the firmware is running */ + User_Led4 = LED_OFF; /* Flash the LED to signal the world the firmware is running */ + wait(0.5); + + } + pc.printf("Finished testing the LEDs...\n\n\r"); + } + + + +/* UART0 Tests */ +static void test_mbed_UART0(void) + { + sint32_t keypress = 0; + + pc.printf("\n\n\n\rTesting UART0\n\n\r"); + UART0.printf("\n\n\rIf you can read this information then UART0 TRANSMIT is working correctly...\n\r"); + UART0.printf("Now to test the UART0 RECEIVE Input...\n\r"); + pc.printf("Now please keys on the keyboard and see if they are echoed on the monitor...\n\r"); + UART0.printf("Now please keys on the keyboard and see if they are echoed on the monitor...\n\r"); + UART0.printf("Press the Return key to quit...\n\r"); + pc.printf("Press the Return key to quit...\n\r"); + + do { + keypress = UART0.getc(); /* get a keypress */ + + UART0.putc(keypress); + UART0.printf("\r"); + + } while(keypress != '\r'); + + pc.printf("\n\rTest finished\n\r"); + UART0.printf("\n\rTest finished\n\r"); + } + + +/* UART1 Tests */ +static void test_mbed_UART1(void) + { + sint32_t keypress = 0; + + pc.printf("\n\n\n\rTesting UART1\n\n\r"); + UART1.printf("\n\n\rIf you can read this information then UART1 TRANSMIT is working correctly...\n\r"); + UART1.printf("Now to test the UART1 RECEIVE Input...\n\r"); + pc.printf("Now please keys on the keyboard and see if they are echoed on the monitor...\n\r"); + UART1.printf("Now please keys on the keyboard and see if they are echoed on the monitor...\n\r"); + UART1.printf("Press the Return key to quit...\n\r"); + pc.printf("Press the Return key to quit...\n\r"); + + do { + keypress = UART1.getc(); /* get a keypress */ + + UART1.putc(keypress); + UART1.printf("\r"); + + } while(keypress != '\r'); + + pc.printf("\n\rTest finished\n\r"); + UART1.printf("\n\rTest finished\n\r"); + } + + + + + +/* Test The CNTRL I2C in Master Mode */ +static void test_mbed_CNTRL_I2C_Master_Mode(void) + { + sint8_t cmd[1] = {0}; + sint8_t keypress = 0; + sint32_t Ack_Status = 0; + uint8_t n = 0; + + pc.printf("\n\n\n\rTesting the CNTRL I2C Peripheral...\n\r"); + pc.printf("Press return key to finish test.\n\n\r"); + cmd[0] = 0x0; /* dummy data to transmit */ + + + do { + pc.printf("Sending out the byte 0x00 to 8 bit address : %d \n\r", n); + + Ack_Status = CNTRL_i2c.write(n, cmd, 1); /* Send an I2C byte */ + if (Ack_Status == ACK) + { + pc.printf("Acknowledge received\n\r"); + } + else{ + pc.printf("No Acknowledge received\n\r"); + } + + n++; + keypress = pc.getc(); /* get a keypress */ + + } while (keypress != '\r'); + + pc.printf("Finished testing CNTRL I2C Peripheral.\n\n\r"); + } + + + +/* Test The CNTRL SPI in Master Mode */ +static void test_mbed_CNTRL_SPI_Master_Mode(void) + { + uint8_t n = 1; + sint8_t keypress = 0; + + pc.printf("\n\n\n\rTesting the CNTRL SPI Peripheral...\n\r"); + pc.printf("Press return key to finish test.\n\n\r"); + + do { + pc.printf("Sending out the byte:%d...\n\r",n); + + CNTRL_SPI_Write_Byte(n); + n++; + + keypress = pc.getc(); /* get a keypress */ + + } while (keypress != '\r'); + + pc.printf("Finished testing CNTRL SPI Peripheral.\n\n\r"); + } + + + + + + + + +/* Base Board Tests Start Here */ +/* *************************** */ + +/* Test The I2C PCA9675 Serial Latch Device on the base board */ +static void test_BB_PCA9675(uint8_t Slave_Address) + { + + uint8_t port_zero = 0; + uint8_t port_one = 0; + uint16_t keypress = 0; + uint8_t n = 0; + sint32_t Ack_Status = 0; + uint8_t Switch_Status = 0; + + pc.printf("\n\n\n\rTest The DIP Switches Via The PCA9675 Serial Input Latch\n\n\r"); + + pc.printf("Writing to the latch, to configure the chip for input...\n\r"); + Ack_Status = RSEDP_BB_PCA9675_write_data(Slave_Address, 0xff,0xff); /* Write 0xff to the output latches so we can read the dip switches */ + if (Ack_Status == ACK) + { + pc.printf("\n\rReading from the latch...\n\r"); + Ack_Status = RSEDP_BB_PCA9675_read_data(Slave_Address, &port_zero, &port_one); /* Read two bytes from the device */ + if (Ack_Status == ACK) + { + pc.printf("Value read...Port0: 0x%.2X",port_zero); + pc.printf(" and Port1: 0x%.2X\r\n",port_one); + + pc.printf("Turn each bit on and off independantly and press space bar to update screen...\n\r"); + pc.printf("To terminate this test press the Return key\n\r"); + + do { + for (n = 1; n < 9; n++) + { + Ack_Status = RS_EDP_BB_Read_DIP_Switch(n, &Switch_Status); + if (Switch_Status == DIP_SWITCH_CLOSED) + { + pc.printf("%.1d:ON ",n); + } + else{ + pc.printf("%.1d:OFF ",n); + } + } + + pc.printf("\r"); + + delay_ms(500); + + keypress = pc.getc(); /* get a keypress */ + + } while ((keypress != '\r') && (Ack_Status == ACK)); + } + } + if (Ack_Status != ACK) + { + pc.printf("*** NO Acknowledge Received ***\n\r"); + pc.printf("Operation aborted\n\r"); + } + + } + + + +/* Test The 32k bit 24LC32 Serial EEPROM on the Base Board */ +static void test_BB_24LC32(uint8_t Slave_Address) + { + sint32_t Ack_Status = 0; + sint8_t I2C_Tx_Array[32]; + sint8_t I2C_Rx_Array[256]; + sint8_t n = 0; + uint16_t nn = 0; + uint8_t error_flag = 0; + + + pc.printf("\n\n\n\rTesting the 24LC32 Device....\n\n\r"); + + for (n=0;n<32;n++) + { + I2C_Tx_Array[n] = 255 - (n*4); /* Configure the array we want to write to the EEPROM */ + } + + n=0; + while(1) /* Clear receieve array */ + { + I2C_Rx_Array[n] = 0; + n++; + if (n == 0) break; + } + + + pc.printf("Writing one byte of data to the 24LC32 Device....\n\r"); + pc.printf("Writing the value 0x%.2X \n\r", EEPROM_TEST_BYTE); + Ack_Status = RSEDP_BB_eeprom_store_byte(Slave_Address, EEPROM_TEST_BYTE, 0x00); /* Store one byte in one location */ + if (Ack_Status == ACK) + { + pc.printf("Reading one byte from the EEPROM.\n\r"); + Ack_Status = RSEDP_BB_eeprom_read_byte(Slave_Address, &n, 0x0); /* Read one byte from one location */ + if (Ack_Status == ACK) + { + pc.printf("Value read...0x%.2X\n\r", n); + + + if (n != EEPROM_TEST_BYTE) + { + pc.printf("FAILED...Data read was different from the data written\n\r"); + while(1); + } + else{ + pc.printf("PASSED - Value read was the same as value written.\n\r"); + } + + + /* Writing Pages To The EEPROM */ + + pc.printf("\n\rWriting pages of data to the 24LC32 Device using page write....\n\r"); + Ack_Status = RSEDP_BB_eeprom_store_bytes(Slave_Address, I2C_Tx_Array, 32, 0x00); /* Write a 32 byte byte page to the I2C serial EEPROM. Note On a page boundary ! */ + + if (Ack_Status == ACK) + { + pc.printf("Reading back 32 bytes from the EEPROM.\n\r"); + Ack_Status = RSEDP_BB_eeprom_read_bytes(Slave_Address, I2C_Rx_Array,32, 0x0); /* Read multiple bytes back from the EEPROM */ + if (Ack_Status == ACK) + { + error_flag = 0; + for (n = 0; n < 32; n++) + { + if (I2C_Tx_Array[n] != I2C_Rx_Array[n]) + { + error_flag = 1; + } + } + + if (error_flag == 1) + { + pc.printf("FAILED...Data read was different from the data written\n\r"); + pc.printf("The transmit array was...\n\r"); + for (n = 0; n < 32; n++) + { + pc.printf("0x%.2X ", I2C_Tx_Array[n]); + } + + pc.printf("\n\r"); + pc.printf("The received array was...\n\r"); + for (n=0;n<32;n++) + { + pc.printf("0x%.2X ", I2C_Rx_Array[n]); + } + + while(1); + } + + else{ + pc.printf("PASSED - Value read was the same as value written.\n\r"); + } + + + /* Writing To The Whole Memory Area */ + pc.printf("\n\nWriting to the whole EEPROM memory address space...\n\r"); + + nn = 0; + do { + Ack_Status = RSEDP_BB_eeprom_store_byte(Slave_Address, (nn/8),nn); + pc.printf("."); + nn++; + wait(0.1); + } while ((Ack_Status == ACK) && (nn < 0x800)); + + pc.printf("\n\r\nChecking the EEPROM...\n\r"); + + if (Ack_Status == ACK) + { + error_flag = 0; + for (nn = 0; nn < 0x800; nn++) + { + Ack_Status = RSEDP_BB_eeprom_read_byte(Slave_Address, &n, nn); + + if (n != nn / 8) + { + error_flag = 1; + } + } + if (error_flag == 1) + { + pc.printf("Test FAILED - Data Read did not match the data written\n\n\r"); + while(1); + } + else{ + pc.printf("Test PASSED - EEPROM is working correctly\n\n\r"); + } + + + } + } + } + } + } + if (Ack_Status != ACK) + { + pc.printf("*** NO Acknowledge Receieve ***\n\r"); + pc.printf("Operation aborted\n\r"); + } + + pc.printf("Finished testing the 24LC32 Device....\n\n\r"); + } + + + +/* This funtction test the RESET Button on the base board */ +static void test_BB_RESET_Button(void) + { + pc.printf("\n\n\n\rTesting the RESET Button\n\r"); + pc.printf("Press The RESET Button and this program should reset back to the Main Test Menu\n\r"); + while(1); /* Wait for reset to be pressed */ + } + + + + + + +/* Communications Board Tests */ + +/* Test the serial RTC Device */ +static void test_PCF8583(uint8_t Slave_Address) + { + sint32_t Ack_Status = 0; + uint8_t status_register = 0; + uint8_t RTC_Array[8]; + uint16_t keypress = 0; + uint16_t nn = 0; + uint8_t value = 0; + + pc.printf("\n\n\n\rTesting the PCA8583 Real Time Clock Chip...\n\r"); + pc.printf("Testing in CLOCK mode...\n\r"); + pc.printf("Configuring the device...\n\r"); + + Ack_Status = RSEDP_COM_setup_PCF8583(PCF8583_COMMS_MODULE,'C'); + + if (Ack_Status == ACK) + { + pc.printf("\n\rReading the status register...\n\r"); + Ack_Status = RSEDP_COM_PCF8583_Read_Status_Register(Slave_Address, &status_register); + } + if (Ack_Status == ACK) + { + pc.printf("Status Register = 0x%2X\r\n",status_register); + pc.printf("\n\rReading the Real Time Clock Contents\n\r"); + pc.printf("Press the retrun key to finish the test\n\r"); + + do { + Ack_Status = RSEDP_COM_PCF8583_Read_RTC(Slave_Address,RTC_Array); + pc.printf("Time is "); + RSEDP_COM_Print_Time_Date_Year(RTC_Array); + pc.printf("\r"); + + keypress = pc.getc(); + + delay_ms(100); + + } while((keypress != '\r') && (Ack_Status == ACK)); + } + + if (Ack_Status == ACK) + { + pc.printf("\n\n\rWriting a new time and date to the RTC device\n\r"); + Ack_Status = RSEDP_COM_PCF8583_Set_Clock(Slave_Address,11,59,40,1,1); // 11:59AM and 45 seconds in AM/PM mode + RSEDP_COM_PCF8583_Set_Date(Slave_Address,6, 31,12,2008); + if (Ack_Status == ACK) + { + pc.printf("\n\rReading back the Real Time Clock Contents\n\r"); + } + pc.printf("Press the retrun key to finish the test\n\r"); + } + + if (Ack_Status == ACK) + { + do { + Ack_Status = RSEDP_COM_PCF8583_Read_RTC(Slave_Address, RTC_Array); + pc.printf("Time is "); + RSEDP_COM_Print_Time_Date_Year(RTC_Array); + pc.printf("\r"); + + keypress = pc.getc(); + + delay_ms(100); + + } while((keypress != '\r') && (Ack_Status == ACK)) ; + } + if (Ack_Status == ACK) + { + pc.printf("\n\n\rChanging to 24 hour notation\n\r"); + Ack_Status = RSEDP_COM_PCF8583_Set_Clock(Slave_Address,23,59,40,0,1); + if (Ack_Status == ACK) + { + Ack_Status = RSEDP_COM_PCF8583_Set_Date(Slave_Address,6, 31,12,2008); + pc.printf("\n\rReading back the Real Time Clock Contents\n\r"); + pc.printf("Press the return key to finish the test\n\r"); + } + } + if (Ack_Status == ACK) + { + do { + Ack_Status = RSEDP_COM_PCF8583_Read_RTC(Slave_Address, RTC_Array); + if (Ack_Status == ACK) + { + pc.printf("Time is "); + RSEDP_COM_Print_Time_Date_Year(RTC_Array); + pc.printf("\r"); + + keypress = pc.getc(); + + delay_ms(100); + } + + } while((keypress != '\r') && (Ack_Status == ACK)); + } + if (Ack_Status == ACK) + { + pc.printf("\n\n\rStopping the CLOCK\n\r\n"); + pc.printf("Press the return key to finish the test\n\r"); + + Ack_Status = RSEDP_COM_PCF8583_Stop_Clock(Slave_Address); + do { + Ack_Status = RSEDP_COM_PCF8583_Read_RTC(Slave_Address, RTC_Array); + if (Ack_Status == ACK) + { + pc.printf("Time is "); + RSEDP_COM_Print_Time_Date_Year(RTC_Array); + pc.printf("\r"); + keypress = pc.getc(); + + delay_ms(100); + } + + } while((keypress != '\r') && (Ack_Status == ACK)); + } + + if (Ack_Status == ACK) + { + pc.printf("\n\n\rStarting the CLOCK again\n\r\n"); + pc.printf("Press the return key to finish the test\n\r"); + + Ack_Status = RSEDP_COM_PCF8583_Start_Clock(Slave_Address); + do { + Ack_Status = RSEDP_COM_PCF8583_Read_RTC(Slave_Address, RTC_Array); + if (Ack_Status == ACK) + { + pc.printf("Time is "); + RSEDP_COM_Print_Time_Date_Year(RTC_Array); + pc.printf("\r"); + keypress = pc.getc(); + + delay_ms(100); + } + + } while((keypress != '\r') && (Ack_Status == ACK)); + } + + if (Ack_Status == ACK) + { + pc.printf("\n\n\rTesting the SRAM area of the RTC...\n\r\n"); + pc.printf("Writing Data to the memory...\n\r"); + + nn = 0x10; + do { + Ack_Status = RSEDP_COM_PCF8583_Write_SRAM(Slave_Address, nn/2, nn); + nn++; + } while ((nn<0x100) && ( Ack_Status == ACK)); + + if (Ack_Status == ACK) + { + pc.printf("Finished writing the SRAM area of the RTC.\n\r"); + pc.printf("Checking the SRAM area of the RTC...\n\r"); + } + + if (Ack_Status == ACK) + { + nn = 0x10; + do { + Ack_Status = RSEDP_COM_PCF8583_Read_SRAM(Slave_Address, &value, nn); + + if (value != nn/2) + { + pc.printf("FAILED TEST - The data read is different from the data written\n\r"); + pc.printf("Failed at memory location 0x%.3X\n\r",nn); + pc.printf("The data written was 0x%.2X\n\r",nn/2); + pc.printf("The data read was 0x%.2X\n\r",value); + while(1); /* Error reading from SRAM */ + } + nn++; + } while((nn < 0x100) && (Ack_Status == ACK)); + } + if (Ack_Status == ACK) + { + pc.printf("PASSED TEST\n\r"); + } + + } + + + if (Ack_Status != ACK) + { + pc.printf("*** NO Acknowledge Receieve ***\n\r"); + pc.printf("Operation aborted\n\r"); + } + + pc.printf("\n\rFinished testing the PCF8583 Real Time Clock device\n\r\n"); + } + + + + + + + +/* Digital I/O Module Tests */ + +/* Test the ULN2003 output with the PCA9555A Device */ +static void test_digital_output_PCA9555(uint8_t Slave_Address) + { + /* assume the I2C and I/O direction have been set up */ + + sint32_t Ack_Status = 0; + uint8_t port_pin = 1; + uint8_t temp8 = 1; + + pc.printf("\n\n\n\rTesting the Digital Outputs under I2C Control...\n\r"); + pc.printf("Press the return key to sequence through the tests.\n\r"); + + Ack_Status = RSEDP_DIO_setup_PCA9555(Slave_Address, 0x00, 0x00); /* Configure Both Port 0 and Port 1 as outputs */ + + if (Ack_Status == ACK) + { + pc.printf("\n\rTesting the Port0 of the PCA9555...\n\r"); + + port_pin = 0; + + do { + pc.printf("\n\rTurning ON the output OUT_P0(%.1d)", port_pin); + + Ack_Status = RSEDP_DIO_PCA9555_Write_Word(Slave_Address, temp8,0x00); + + if (Ack_Status == ACK) + { + pc.getc(); + + pc.printf("\n\rTurning OFF the output OUT_P0(%.1d)", port_pin); + + Ack_Status = RSEDP_DIO_PCA9555_Write_Word(Slave_Address, 0x00, 0x00); + } + if (Ack_Status == ACK) + { + pc.getc(); + } + + temp8 = (temp8 << 1); + pc.printf("\n\r"); + port_pin++; + + } while ((port_pin < 8) && (Ack_Status == ACK)); + + } + if (Ack_Status == ACK) + { + pc.printf("\n\rTesting the Port1 of the PCA9555...\n\r"); + temp8 = 0x01; + + port_pin = 0; + for (port_pin = 0; port_pin < 8; port_pin++) + do { + pc.printf("\n\rTurning ON the output OUT_P1(%.1d)", port_pin); + + Ack_Status = RSEDP_DIO_PCA9555_Write_Word(Slave_Address, 0x00, temp8); + if (Ack_Status == ACK) + { + pc.getc(); + + pc.printf("\n\rTurning OFF the output OUT_P1(%.1d)",port_pin); + + Ack_Status = RSEDP_DIO_PCA9555_Write_Word(Slave_Address, 0x00,0x00); + } + pc.getc(); + + temp8 = (temp8 << 1); + pc.printf("\n\r"); + port_pin++; + } while ((port_pin < 8) && (Ack_Status == ACK)); + } + + if (Ack_Status != ACK) + { + pc.printf("*** NO Acknowledge Receieve ***\n\r"); + pc.printf("Operation aborted\n\r"); + } + pc.printf("\n\r\nFinished testing the Digital Output under I2C Control\r\r\n"); + } + + + + + + +/* Test The Inputs to the PCA9555 serial I/O device */ +/* The device is configured as an input device. */ +static void test_digital_input_PCA9555(uint8_t Slave_Address) + { + + sint32_t Ack_Status = 0; + uint8_t port_one = 0; + uint8_t port_zero = 0; + uint16_t keypress = 0; + uint16_t input_data = 0; + uint8_t n= 0; + + + pc.printf("\n\n\n\rTesting the Digital Inputs via I2C Control...\n\r"); + pc.printf("Press the return key to sequence through the tests.\n\r"); + + Ack_Status = RSEDP_DIO_setup_PCA9555(Slave_Address, 0xff, 0xff); /* Configure Both Port 0 and Port 1 as inputs */ + + if (Ack_Status == ACK) + { + pc.printf("\n\rTesting the Ports of the I2C device in input mode...\n\r"); + + pc.printf("\n\rReading from the device...\n\r"); + pc.printf("To terminate this test press the Return key\n\r\n"); + + pc.printf("Value read of the Port 0 and Port 1 pins are:\n\r"); + pc.printf(" Port 0 Port 1 \n\r"); + pc.printf("0 1 2 3 4 5 6 7 {} 0 1 2 3 4 5 6 7\n\r"); + + + do { + Ack_Status = RSEDP_DIO_PCA9555_Read_Data(Slave_Address, &port_zero, &port_one); /* Read the DIP Switches onthe base board */ + + if (Ack_Status == ACK) + { + input_data = ((port_one << 8) + port_zero); + for (n = 0u; n < 16u; n++) + { + if (n == 8) + { + pc.printf(" "); + } + if ((input_data & 0x0001) == 0u) + { + pc.printf("O "); + } + else{ + pc.printf("1 "); + } + + input_data = input_data >> 1; + } + + pc.printf("\r"); + keypress = pc.getc(); + } + + } while ((keypress != '\r') && (Ack_Status == ACK)); + } + if (Ack_Status != ACK) + { + pc.printf("*** NO Acknowledge Receieve ***\n\r"); + pc.printf("Operation aborted\n\r"); + } + + pc.printf("\n\r\nFinished testing the Serial Digital Input\r\r\n"); + + } + + + + +/* Analogue Module Tests */ + +/* Test MAX1038 ADC On AN16 Module */ +static void test_MAX1x3x(uint8_t Slave_Address) + { + sint32_t Ack_Status = 0; + uint8_t uiChannel = 0u; + uint8_t u8Result = 0u; + uint16_t u16Result = 0u; + uint8_t keypress = 0u; + + pc.printf("\n\rTesting the serial ADC on the Analogue Module...\n\r"); + + pc.printf("\n\rConfiguring the MAX1x3x %d bit ADC converter...\n\r",ADC_BITSIZE); + Ack_Status = RSEDP_AM_Init_MAX1x3x(Slave_Address) ; + if (Ack_Status == ACK) + { + pc.printf("\n\rMAX1x3x Now Configured"); + + + /* Test all channels */ + pc.printf("\n\rPress 'RETURN' key to terminate the test\n\rChannel Readings Are:\n\r"); + pc.printf("CH00 CH01 CH02 CH03 CH04 CH05 CH06 CH07 CH08 CH09 CH10 CH11\n\r"); + do { + for(uiChannel = 0u ; uiChannel < MAX1x3x_No_Of_Channels; uiChannel++) + { + if (ADC_BITSIZE == ADC_8BIT) /* 8 bit ADC fitted to analogue module */ + { + Ack_Status = RSEDP_AM_MAX103x_ReadChannel(Slave_Address, &u8Result, uiChannel); /* this line for 8 bit ADC */ + u16Result = u8Result; + } + else{ /* 10 bit ADC fitted to analogue module */ + Ack_Status = RSEDP_AM_MAX113x_ReadChannel(Slave_Address, &u16Result, uiChannel); /* this line for 10bit ADC */ + } + + pc.printf("0x%.3X ", (u16Result & 0x01ff)); + } + + pc.printf("\r"); + delay_ms(500u); + + keypress = pc.getc(); + + } while ((keypress != '\r') && (Ack_Status == ACK)); + } + + if (Ack_Status != ACK) + { + pc.printf("*** NO Acknowledge Receieve ***\n\r"); + pc.printf("Operation aborted\n\r"); + } + + pc.printf("\n\rfinished testing the ADC on the Analogue Module\n\r"); + } + + + + +/* Test AD5263 Digital Pot */ +static void test_AD5263(uint8_t Slave_Address) + { + sint32_t Ack_Status = 0; + uint8_t channel = 0; + uint32_t resistance =0; + + pc.printf("\n\rTesting the serial digital potentiometer on the Analogue Module...\n\r"); + + pc.printf("\n\rInitialising the AD5263 device...\n\r"); /* Initialise the on board ADC */ + Ack_Status = RSEDP_AM_Init_AD5263(Slave_Address) ; + + if (Ack_Status == ACK) + { + pc.printf("\n\rAD5263 Now Configured"); + + + for (channel = 1; channel < 5; channel++) + { + pc.printf("\n\rTesting the variable resistor on channel: %1d\n\r", channel); + resistance = 0u; + do { + pc.printf("\rSetting Resistance to: %5d ohms", resistance); + Ack_Status = RSEDP_AM_Set_AD5263_resistance(Slave_Address, channel, resistance); + resistance += (AD5263_Max_Resistance/256); + delay_ms(50); + } while ((Ack_Status == ACK) && (resistance < AD5263_Max_Resistance)); + pc.printf("\n\r"); + } + } + + if (Ack_Status == ACK) + { + Ack_Status = RSEDP_AM_Init_AD5263(Slave_Address) ; /* Reset the device back to power up state */ + } + + if (Ack_Status != ACK) + { + pc.printf("*** NO Acknowledge Receieve ***\n\r"); + pc.printf("Operation aborted\n\r"); + } + + pc.printf("\n\rFinished testing the AD5263 Device\n\r"); + } + + + + + +/* Motor Control MC1 Tests */ + +/* Test the VDCLINK Voltage */ +static void test_MC1_VDCLINK(void) + { + sint8_t keypress = 0; + uint16_t vdc_measured = 0; + float vbus_voltage = 0.0f; + + pc.printf("\n\rTesting the VDCLINK Voltage on the MC1 Brushed DC Motor Module...\n\r"); + do { + + vdc_measured = RSEDP_MC1_Read_VDCLINK(AN2); + vbus_voltage = ((float)vdc_measured / VSENSE_DIVISOR); + + pc.printf("The ADC Voltage measured is %4dmV, which is a bus voltage of %.0fV\r", vdc_measured, vbus_voltage); + + keypress = pc.getc(); + } while (keypress != '\r'); + + pc.printf("\n\rFinished testing the VDCLINK bus voltage\n\r"); + } + + + +/* Test the motor current sense voltage */ +static void test_MC1_VSENSE(void) + { + sint8_t keypress = 0; + uint16_t vdc_measured = 0; + float motor_current = 0.0f; + + pc.printf("\n\rTesting the VSENSE Motor Current Voltage Feedback on the MC1 Brushed DC Motor Module...\n\r"); + do { + + vdc_measured = RSEDP_MC1_Read_VSENSE(AN0); + motor_current =( (float)vdc_measured /(CURRENT_TRANSFER_RATIO * MOTOR_CURRENT_SENSE_RESISTOR)); /* Work out current in mA */ + + pc.printf("The ADC Voltage measured is %4dmV, which is aprrox motor_current of %.0fmA\r", vdc_measured, motor_current); + + keypress = pc.getc(); + } while (keypress != '\r'); + + pc.printf("\n\rFinished testing the VSENSE motor current sense input\n\r"); + } + + + + + + +/* Test the encoder inputs */ +static void test_MC1_Read_Encoders(void) + { + sint8_t keypress = 0; + uint8_t switch_status0 = 0; + uint8_t switch_status1 = 0; + + pc.printf("\n\rTesting the Encoder0 & 1 from P301 connector Pin8 & Pin10 on the MC1 Module...\n\r"); + pc.printf("The Encoder inputs are:\n\r"); + + do { + switch_status0 = RSEDP_MC1_Read_Encoder0_Input(EVG6_GPIO52); + switch_status1 = RSEDP_MC1_Read_Encoder1_Input(EVG7_GPIO54); + + if (switch_status0 == 0) + { + pc.printf("Encoder0: OPEN ,"); + } + else{ + pc.printf("Encoder0: CLOSED,"); + } + + if (switch_status1 == 0) + { + pc.printf("Encoder1: OPEN \r"); + } + else{ + pc.printf("Encoder1: CLOSED\r"); + } + + keypress = pc.getc(); + } while (keypress != '\r'); + + pc.printf("\n\rFinished testing the Encoder inputs from P301\n\r"); + } + + +/* test the Brake control signal */ +static void test_MC1_Brakes(void) + { + sint8_t keypress = 0; + + pc.printf("\n\rTesting the Brake control signal to the motor control module...\n\r"); + + do { + pc.printf("Turning ON the brakes...\n\r"); + RSEDP_MC1_Brake(BRAKE_ON, GPIO0); /* Brake ON */ + pc.printf("Press any key to turn the brake OFF\n\r"); + pc.getc(); + RSEDP_MC1_Brake(BRAKE_OFF, GPIO0); /* Brake OFF */ + pc.printf("Press any key to turn the brake ON again or 'Return' to terminate test\n\r"); + keypress = pc.getc(); + } while (keypress != '\r'); + + pc.printf("\n\rFinished testing the Brake control signal \n\r"); + } + +/* test the direction Signal */ +static void test_MC1_Set_Direction(void) + { + uint8_t motor_direction = FORWARD; + uint8_t keypress = 0; + + pc.printf("\n\rTesting the motor rotation direction signal...\n\r"); + + do { + pc.printf("Setting the motor direction as:"); + if (motor_direction == FORWARD) + { + pc.printf("FORWARD\r"); + } + if (motor_direction == REVERSE) + { + pc.printf("REVERSE\r"); + } + + RSEDP_MC1_Set_Motor_Direction(motor_direction, EVG1_GPIO42); /* Set the motor direction */ + + keypress = pc.getc(); + + if (motor_direction == FORWARD) + { + motor_direction = REVERSE; + } + else{ + motor_direction = FORWARD; + } + } while (keypress != '\r'); + + pc.printf("\n\rFinished motor direction test\n\r"); + } + + +/* Testing the motor speed control */ +static void test_MC1_Speed_Ramp_UpDown(void) + { + + uint8_t n= 0; + float motor_current = 0; + uint16_t vdc_measured = 0; + + pc.printf("\n\rTesting the speed control of the motor control module...\n\r"); + + pc.printf("Brake turned OFF\n\r"); + RSEDP_MC1_Brake(BRAKE_OFF, GPIO0); /* Brake OFF */ + + pc.printf("Ramping Up\n\r"); + + for (float ff = 0; ff < 1.0f; ff += 0.01f) + { + RSEDP_MC1_Set_Motor_Speed_Duty(ff, EVG0_GPIO40); + pc.printf("Duty %3.0f%%\r", (ff*100)); + wait(0.1); + } + + pc.printf("\n\rat full speed\n\r"); + + for (n = 0; n < 100; n++) + { + vdc_measured = RSEDP_MC1_Read_VSENSE(AN0); + motor_current =( (float)vdc_measured /(CURRENT_TRANSFER_RATIO * MOTOR_CURRENT_SENSE_RESISTOR)); /* Work out current in mA */ + + pc.printf("The ADC Voltage measured is %4dmV, which is aprrox motor_current of %.0fmA\r", vdc_measured, motor_current); + wait(0.1); + } + + + pc.printf("Ramping Down\n\r"); + + for (float ff=1.0; ff > 0.0f; ff-= 0.01f) + { + RSEDP_MC1_Set_Motor_Speed_Duty(ff, EVG0_GPIO40); + pc.printf("Duty %3.0f%%\r",(ff*100)); + wait(0.1); + } + + pc.printf("\n\rMotor Stopped\n\r"); + RSEDP_MC1_Set_Motor_Speed_Duty(0.0f, EVG0_GPIO40); + + RSEDP_MC1_Brake(BRAKE_ON, GPIO0); /* Brake ON */ + pc.printf("Brake turned ON\n\r"); + pc.printf("\n\rFinished testing the speed control of the motor control module\n\r"); + } + + +static void test_MC1_Set_Speed_PWM_Duty(void) + { + uint8_t keypress = 0; + float ff = 0.0f; + + pc.printf("\n\rSet the Motor Speed PWM Duty Ratio...\n\r"); + pc.printf("Use the '+' and '-' Keys to increase the duty and 'return' key to end.\n\r"); + + pc.printf("Brake turned OFF\n\r"); + RSEDP_MC1_Brake(BRAKE_OFF, GPIO0); /* Brake OFF */ + + + do { + keypress = pc.getc(); + if (keypress == '+') + { + ff = (ff + 0.1f); + if (ff > 1.0) ff = 1.0; + } + if (keypress == '-') + { + ff = (ff - 0.1f); + if (ff < 0.0) ff = 0.0; + } + + RSEDP_MC1_Set_Motor_Speed_Duty(ff, EVG0_GPIO40); + pc.printf("Duty %3.0f%%\r", (ff*100)); + } while (keypress != '\r'); + + pc.printf("\n\rLeaving Menu option with PWM duty still set\n\r"); + + } + + + +/* Stopping the motor */ +static void test_MC1_Stop_Motor(void) + { + pc.printf("\n\rRamping Down the motor\n\r"); + + for (float ff=0.5; ff > 0.0f; ff-= 0.01f) + { + RSEDP_MC1_Set_Motor_Speed_Duty(ff, EVG0_GPIO40); + wait(0.1); + } + + pc.printf("Motor Stopped\n\r"); + RSEDP_MC1_Set_Motor_Speed_Duty(0.0f, EVG0_GPIO40); + + RSEDP_MC1_Brake(BRAKE_ON, GPIO0); /* Brake ON */ + pc.printf("Brake turned ON\n\r"); + + pc.printf("\n\rFinished stopping the motor\n\r"); + + } + + + + + + + + + + + + + +/* General Purpose Delay Routine */ +static void delay_ms(uint16_t time_delay) + { + uint32_t nnnn=0; + + while(time_delay--!=0x0) + { + for (nnnn=0;nnnn<0x08ff;nnnn++); /* 1ms Loop */ + } + } +