Advertisement
AntonioVillanueva

Test for i2c MCP23017 bus expander in C++ object

Nov 30th, 2017
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. //Test for i2c mcp23017 bus expander Antonio Villanueva Segura
  2. #include <iostream>
  3. #include <fcntl.h>
  4. #include <stdlib.h>     // exit
  5. #include <linux/i2c-dev.h>//I2C_SLAVE
  6. #include <sys/ioctl.h>//ioctl
  7. #include <unistd.h> //read write usleep
  8.  
  9. #define I2C_ADDR 0x20 //Address mcp23017 expander
  10. #define DEV_I2C "/dev/i2c-0" //device in linux /de
  11.  
  12. using namespace std;
  13.  
  14. class mcp23017{
  15.     public:
  16.     mcp23017();
  17.     unsigned char I2CRead () ;//Read  GPIOA
  18.     void I2CWrite (unsigned char data);//write GPIOB       
  19.    
  20.     private:
  21.     int fd;//file descriptor
  22.     char buffer[2];//buffer[0] register ,buffer[1] data
  23.     int I2COpen();//Try open file descriptor
  24.     void I2CSetup (int fd);//Setup mcp23017
  25. };
  26. /*--------------------------------------------------------------------*/
  27.     mcp23017::mcp23017(){
  28.          fd=I2COpen();//Try open file descriptor
  29.          if (fd<0){exit(0);}//fd error !       
  30.          I2CSetup (fd);//Setup mcp23017
  31.         }
  32. /*--------------------------------------------------------------------*/
  33.     int mcp23017 ::I2COpen(){//Try open file descriptor
  34.  
  35.         fd = open(DEV_I2C, O_RDWR);//open file descriptor
  36.  
  37.         if (fd < 0) {//test fd
  38.             cout <<"Error opening file: "<<DEV_I2C<<endl;
  39.             return -1; 
  40.         }
  41.  
  42.         if (ioctl(fd, I2C_SLAVE, I2C_ADDR) < 0) {
  43.             cout <<"ioctl error: "<<I2C_ADDR<<" "<< endl;
  44.             return -1;
  45.         }
  46.  
  47.         return fd;
  48.     }
  49. /*--------------------------------------------------------------------*/
  50.     void mcp23017::I2CSetup (int fd){//Setup mcp23017  
  51.    
  52.         buffer[1]=0x00;//Valeur register
  53.        
  54.         ////Clr.regs.mcp23017 IODIRB(0x01)=0x00 => GPIOB OUTPUT
  55.         for( size_t reg=0x01 ;reg<0x10;reg++){
  56.             buffer[0]=reg;//load register
  57.             write(fd,buffer,2);
  58.             usleep(1000);
  59.         }
  60.    
  61.         //IODIRA (0x00)=0xFF => GPIOA INPUT
  62.         buffer[0]=0x00;//Register IODIRA
  63.         buffer[1]=0xFF;// Value INPUT
  64.         write(fd,buffer,2);
  65.        
  66.     }
  67.  
  68. /*--------------------------------------------------------------------*/
  69.     unsigned char  mcp23017::I2CRead () {//Read  GPIOA
  70.         buffer[0]=0x12;//GPIOA
  71.         write(fd,buffer,1);
  72.    
  73.         read(fd, &buffer[1], 1);
  74.         return buffer[1];      
  75.     }
  76. /*--------------------------------------------------------------------*/
  77.     void mcp23017::I2CWrite ( unsigned char data){//write GPIOB
  78.         buffer[0]=0x13;//GPIOB
  79.         buffer[1]=data;
  80.         write(fd,buffer,2);
  81.     }
  82.    
  83. /*--------------------------------------------------------------------*/
  84. /*--------------------------------------------------------------------*/
  85. int main (){
  86.     unsigned char data(0);//data for test outs
  87.     unsigned char read(0);//read data from GPIOA
  88.    
  89.     mcp23017 strac;
  90.    
  91.     while (true){//Bucle test
  92.         std::cout.flags ( std::ios::right | std::ios::hex | std::ios::showbase );
  93.         std::cout.width (4);
  94.    
  95.         if (strac.I2CRead()!=read){//only show if I2CRead change !
  96.             cout <<"INPUT GPIOA = " <<(int) (read=strac.I2CRead())<<endl;//Read GPIOA          
  97.         }
  98.         usleep(500000);
  99.  
  100.        
  101.         strac.I2CWrite (data++);//WRITE GPIOB  
  102.         usleep(500000);    
  103.     }
  104.    
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement