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.
Source/main.cpp@0:3331b5950572, 2010-11-23 (annotated)
- Committer:
- DavidGilesHitex
- Date:
- Tue Nov 23 10:59:14 2010 +0000
- Revision:
- 0:3331b5950572
Who changed what in which revision?
User | Revision | Line number | New 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 | } |