This is a complete listing of the RS-EDP software for the mbed module to support the RS-EDP platform.

Dependencies:   mbed

SourceFiles/RSEDP_BB_PCA9675_Serial_Input_Latch.cpp

Committer:
DavidGilesHitex
Date:
2010-11-19
Revision:
0:5b7639d1f2c4

File content as of revision 0:5b7639d1f2c4:

/* Software Driver for Serial Input Latch PCA9675 on the RS-EDP Base Board */
/* *********************************************************************** */



/* Version 1.00 */



/* Include Files */
/* Include Files Here */
#include "mbed.h"                                /* mbed header file */
#include "misra_types.h"                         /* MISRA Types header file */
#include "defines.h"
#include "RSEDP_Slave_Address_Defines.h"        /* Slave address of I2C Peripherals */

#include "mbed_Port_Structure.h"                /* Port structure for MBED Module */
#include "RSEDP_CNTRL_I2C.h"                    /* Control I2C Driver */



/* Function Prototypes Defines Here */
sint32_t RSEDP_BB_setup_PCA9675(uint8_t Slave_Address);                                                          /* Setup and configure the I/O latch */
sint32_t RSEDP_BB_PCA9675_reset(uint8_t Slave_Address);                                                          /* Reset the device using a general call */
sint32_t RSEDP_BB_PCA9675_write_data(uint8_t Slave_Address, uint8_t port0_payload,uint8_t port1_payload);        /* Write two bytes of data to the device */
sint32_t RSEDP_BB_PCA9675_read_data(uint8_t Slave_Address, uint8_t *read_port0, uint8_t *read_port1);            /* Read two bytes from the device */
sint32_t RS_EDP_BB_Read_DIP_Switch(uint8_t Switch_Number);                                                       /* Read the switch position - either on or off */





/* Configure the Serial I/O Expander IC */
sint32_t RSEDP_BB_setup_PCA9675(uint8_t Slave_Address)
    {
       sint32_t Ack_Status = 0;
        /* Assume the I2C peripheral and MCU I/O is already configured */

        Ack_Status = RSEDP_BB_PCA9675_reset(Slave_Address);                                              /* Reset the device */
        if (Ack_Status == ACK)
            {
                Ack_Status = RSEDP_BB_PCA9675_write_data(Slave_Address, 0xff,0xff);                                /* This configures all I/O as input */
            }
        return Ack_Status;
    }    
    
    

/* Reset the device */                
sint32_t RSEDP_BB_PCA9675_reset(uint8_t Slave_Address)
    {
        sint32_t Ack_Status = 0;
        sint8_t reset_command = 0x06;                                                   /* Reset command following a general call, address 0 will reset the device */

        Ack_Status = CNTRL_I2C_Master_Mode_Transmit(0x0, &reset_command, 2);            /* Send a general call command, (Slave address 0), plus one byte of value 0x06 */
                                                                                        /* The PCA9675 does not generate an ACK on a general call */
        return Ack_Status;                                                                                        
    }                                    


/* Write two byte of data to the device */
sint32_t RSEDP_BB_PCA9675_write_data(uint8_t Slave_Address, uint8_t port0_payload, uint8_t port1_payload)
    {
        sint32_t Ack_Status = 0;
        sint8_t tx_array[2];                                                        /* Local array of data to be transmitted */
        
        tx_array[0] = port0_payload;                                                /* First is for Port 0 */
        tx_array[1] = port1_payload;                                                /* Second is for Port 1 */
        
        Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, tx_array, 2);    /* Send two bytes plus the slave address to the slave */
        return Ack_Status;
    }


/* Read two bytes from the device */
sint32_t RSEDP_BB_PCA9675_read_data(uint8_t Slave_Address, uint8_t *read_port0, uint8_t *read_port1)
    {
        sint32_t Ack_Status = 0;
        sint8_t rx_array[2];                                                      /* Local reception array */

        Ack_Status = CNTRL_I2C_Master_Mode_Receive(Slave_Address, rx_array, 2);   /* Receive two bytes */
        *read_port0=rx_array[0];                                                  /* transfer data back to pointer */
        *read_port1=rx_array[1];                                                  /* transfer data back to pointer */
        return Ack_Status;
    }        


/* Read the switch position - either on or off */
sint32_t RS_EDP_BB_Read_DIP_Switch(uint8_t Switch_Number, uint8_t *Switch_Status)
    {
        sint32_t Ack_Status = 0;
        uint8_t port0 = 0;                                                        
        uint8_t port1 = 0;
        
        Ack_Status = RSEDP_BB_PCA9675_read_data(PCA9675_BASE_BOARD, &port0, &port1);
        
        switch (Switch_Number)
            {
        
            case 1:
                if ((port0 & 0x01) == SWITCH_ON) 
                    {
                        *Switch_Status = DIP_SWITCH_CLOSED;
                    }
                else{
                        *Switch_Status = DIP_SWITCH_OPEN;
                    }
                break;

            case 2:
                if ((port0 & 0x02) == SWITCH_ON)
                    {
                        *Switch_Status = DIP_SWITCH_CLOSED;
                    }
                else{
                        *Switch_Status = DIP_SWITCH_OPEN;
                    }
                break;
                                
            case 3:
                if ((port0 & 0x04) == SWITCH_ON)
                    {
                        *Switch_Status = DIP_SWITCH_CLOSED;
                    }
                else{
                        *Switch_Status = DIP_SWITCH_OPEN;
                    }
                break;
                        
            case 4:
                if ((port0 & 0x08) == SWITCH_ON)
                    {
                        *Switch_Status = DIP_SWITCH_CLOSED;
                    }
                else{
                        *Switch_Status = DIP_SWITCH_OPEN;
                    }
                break;
                
            case 5:
                if ((port0 & 0x10) == SWITCH_ON)
                    {
                        *Switch_Status = DIP_SWITCH_CLOSED;
                    }
                else{
                        *Switch_Status = DIP_SWITCH_OPEN;
                    }
                break;
                
            case 6:
                if ((port0 & 0x20) == SWITCH_ON)
                    {
                        *Switch_Status = DIP_SWITCH_CLOSED;
                    }
                else{
                        *Switch_Status = DIP_SWITCH_OPEN;
                    }
                break;
                
            case 7:
                if ((port0 & 0x40) == SWITCH_ON) 
                    {
                        *Switch_Status = DIP_SWITCH_CLOSED;
                    }
                else{
                        *Switch_Status = DIP_SWITCH_OPEN;
                    }
                break;
                
            case 8:
                if ((port0 & 0x80) == SWITCH_ON) 
                    {
                        *Switch_Status = DIP_SWITCH_CLOSED;
                    }
                else{
                        *Switch_Status = DIP_SWITCH_OPEN;
                    }
                break;
                
            default:
                    {
                        *Switch_Status = port0;
                    }
            }        
        return Ack_Status;
     }