This software drives a PCA9675 device via an I2C bus. Included functions allow you to read the device ID, set the IO direction, and read and write from the device.

Dependencies:   mbed

Committer:
DavidGilesHitex
Date:
Tue Nov 23 10:59:14 2010 +0000
Revision:
0:3331b5950572

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DavidGilesHitex 0:3331b5950572 1 /* PCA9675 Device Driver C++ Example */
DavidGilesHitex 0:3331b5950572 2 /* ********************************* */
DavidGilesHitex 0:3331b5950572 3
DavidGilesHitex 0:3331b5950572 4 #include "mbed.h"
DavidGilesHitex 0:3331b5950572 5 #include "misra_types.h" /* MISRA Types */
DavidGilesHitex 0:3331b5950572 6 #include "PCA9675.h"
DavidGilesHitex 0:3331b5950572 7
DavidGilesHitex 0:3331b5950572 8
DavidGilesHitex 0:3331b5950572 9 #define PCA9675_BASE_BOARD_SLAVE_ADDRESS 0x20
DavidGilesHitex 0:3331b5950572 10
DavidGilesHitex 0:3331b5950572 11
DavidGilesHitex 0:3331b5950572 12 /* I2C Interface */
DavidGilesHitex 0:3331b5950572 13 /* Create a master I2C bus called CNTRL_i2C using pins 9 and 10 for SDA, & SCL respectively */
DavidGilesHitex 0:3331b5950572 14 /* This I2C bus can be used fr many peripherals and not just the PCA9675 */
DavidGilesHitex 0:3331b5950572 15 I2C CNTRL_i2c(p9, p10);
DavidGilesHitex 0:3331b5950572 16
DavidGilesHitex 0:3331b5950572 17 /* Configure the USB as a virtual communications port */
DavidGilesHitex 0:3331b5950572 18 Serial pc(USBTX, USBRX);
DavidGilesHitex 0:3331b5950572 19
DavidGilesHitex 0:3331b5950572 20 /* Create a global object of PCA96755 class called BaseBoardLatch */
DavidGilesHitex 0:3331b5950572 21 /* this device will use CNTRL_i2c bus and has a slave address of PCA9675_BASE_BOARD_SLAVE_ADDRESS*/
DavidGilesHitex 0:3331b5950572 22 PCA9675 BaseBoardLatch(&CNTRL_i2c, PCA9675_BASE_BOARD_SLAVE_ADDRESS);
DavidGilesHitex 0:3331b5950572 23
DavidGilesHitex 0:3331b5950572 24
DavidGilesHitex 0:3331b5950572 25 int main()
DavidGilesHitex 0:3331b5950572 26 {
DavidGilesHitex 0:3331b5950572 27 uint8_t port0_payload = 0;
DavidGilesHitex 0:3331b5950572 28 uint8_t port1_payload = 0;
DavidGilesHitex 0:3331b5950572 29 uint8_t manufacturer = 0;
DavidGilesHitex 0:3331b5950572 30 uint16_t part_ident = 0;
DavidGilesHitex 0:3331b5950572 31 uint8_t die_revision = 0;
DavidGilesHitex 0:3331b5950572 32 uint8_t MySlaveAddress = 0;
DavidGilesHitex 0:3331b5950572 33 sint32_t Ack_Status = 0;
DavidGilesHitex 0:3331b5950572 34
DavidGilesHitex 0:3331b5950572 35 pc.baud(115000); /* Baud rate should be 115k baud */
DavidGilesHitex 0:3331b5950572 36 pc.format(8,Serial::None,1); /* format is 8 data bits, no stop bit, no parity */
DavidGilesHitex 0:3331b5950572 37 pc.printf("\n\n\n\n\n\n\n\rWelcome to the I2C PCA9675 Driver Test Routines for mbed\n\r\n");
DavidGilesHitex 0:3331b5950572 38
DavidGilesHitex 0:3331b5950572 39 CNTRL_i2c.frequency(400000); /* Set the I2C to be 400kHz */
DavidGilesHitex 0:3331b5950572 40
DavidGilesHitex 0:3331b5950572 41 /* Read the PCA9575 device ID */
DavidGilesHitex 0:3331b5950572 42 pc.printf("Reading the device ID\n\r");
DavidGilesHitex 0:3331b5950572 43 Ack_Status = BaseBoardLatch.read_device_ID(&manufacturer, &part_ident, &die_revision);
DavidGilesHitex 0:3331b5950572 44 pc.printf("Read ID: Ack status = ");
DavidGilesHitex 0:3331b5950572 45 if (Ack_Status == BaseBoardLatch.eI2C_ACK) pc.printf("ACK\n\r");
DavidGilesHitex 0:3331b5950572 46 else pc.printf ("NACK\n\r");
DavidGilesHitex 0:3331b5950572 47 pc.printf("The stored identification for this device is:\n\r");
DavidGilesHitex 0:3331b5950572 48 pc.printf(" * Manufacturer Code = 0x%.2x\n\r", manufacturer);
DavidGilesHitex 0:3331b5950572 49 pc.printf(" * Part Idenfification = 0x%.4x\n\r", part_ident);
DavidGilesHitex 0:3331b5950572 50 pc.printf(" * Die Revision = 0x%.1x\n\r", die_revision);
DavidGilesHitex 0:3331b5950572 51
DavidGilesHitex 0:3331b5950572 52
DavidGilesHitex 0:3331b5950572 53 /* Use this code for output */
DavidGilesHitex 0:3331b5950572 54
DavidGilesHitex 0:3331b5950572 55 /* Setup the I/O direction : for each bit 1=input and 0=output */
DavidGilesHitex 0:3331b5950572 56 /* Order is Port0 and Port1 */
DavidGilesHitex 0:3331b5950572 57 pc.printf("\nSetting the device for quasi output mode\n\r");
DavidGilesHitex 0:3331b5950572 58 Ack_Status = BaseBoardLatch.init(0x00, 0x00);
DavidGilesHitex 0:3331b5950572 59 pc.printf("Initialise: Ack status = ");
DavidGilesHitex 0:3331b5950572 60 if (Ack_Status == BaseBoardLatch.eI2C_ACK) pc.printf("ACK\n\r");
DavidGilesHitex 0:3331b5950572 61 else pc.printf ("NACK\n\r");
DavidGilesHitex 0:3331b5950572 62
DavidGilesHitex 0:3331b5950572 63 pc.printf("Writing data to the latch\n\r");
DavidGilesHitex 0:3331b5950572 64 Ack_Status = BaseBoardLatch.write_data(port0_payload, port1_payload); /* Write two bytes of data to the device */
DavidGilesHitex 0:3331b5950572 65 pc.printf("Write data: Ack status = ");
DavidGilesHitex 0:3331b5950572 66 if (Ack_Status == BaseBoardLatch.eI2C_ACK) pc.printf("ACK\n\r");
DavidGilesHitex 0:3331b5950572 67 else pc.printf ("NACK\n\r");
DavidGilesHitex 0:3331b5950572 68
DavidGilesHitex 0:3331b5950572 69
DavidGilesHitex 0:3331b5950572 70 /* Use this code for input */
DavidGilesHitex 0:3331b5950572 71
DavidGilesHitex 0:3331b5950572 72 /* Setup the I/O direction : for each bit 1=input and 0=output */
DavidGilesHitex 0:3331b5950572 73 /* Order is Port0 and Port1 */
DavidGilesHitex 0:3331b5950572 74 pc.printf("\nSetting the device for quasi input mode\n\r");
DavidGilesHitex 0:3331b5950572 75 Ack_Status = BaseBoardLatch.init(0xff, 0xff);
DavidGilesHitex 0:3331b5950572 76 pc.printf("Initialise: Ack status = ");
DavidGilesHitex 0:3331b5950572 77 if (Ack_Status == BaseBoardLatch.eI2C_ACK) pc.printf("ACK\n\r");
DavidGilesHitex 0:3331b5950572 78 else pc.printf ("NACK\n\r");
DavidGilesHitex 0:3331b5950572 79
DavidGilesHitex 0:3331b5950572 80 Ack_Status = BaseBoardLatch.read_data(&port0_payload, &port1_payload); /* Read two bytes from the device */
DavidGilesHitex 0:3331b5950572 81 pc.printf("Read data: Ack status = ", Ack_Status);
DavidGilesHitex 0:3331b5950572 82 if (Ack_Status == BaseBoardLatch.eI2C_ACK) pc.printf("ACK\n\r");
DavidGilesHitex 0:3331b5950572 83 else pc.printf ("NACK\n\r");
DavidGilesHitex 0:3331b5950572 84 pc.printf("Port0 = 0x%.2x, Port1 = 0x%.2x\n\r", port0_payload, port1_payload);
DavidGilesHitex 0:3331b5950572 85
DavidGilesHitex 0:3331b5950572 86
DavidGilesHitex 0:3331b5950572 87 /* Read back the slave address of the PCA9675 object if we need to recall it */
DavidGilesHitex 0:3331b5950572 88 MySlaveAddress = BaseBoardLatch.read_slave_address();
DavidGilesHitex 0:3331b5950572 89 pc.printf("\nThe 7 bit Slave address: is = 0x%.2x\n\r", MySlaveAddress);
DavidGilesHitex 0:3331b5950572 90
DavidGilesHitex 0:3331b5950572 91 }