GPIO模拟I2C操作

  1. /****I2C*****I2C*****I2C*****I2C*****I2C*****I2C*****I2C*****I2C*****I2C*****I2C*****I2C****/  
  2. #define DELAY   1  
  3. #define SCL     89  
  4. #define SDA     20  
  5. #define RST     19  
  6. #define IRQ     108  
  7. void i2c_start(void
  8. {      
  9.     gpio_direction_output(SDA, 1);   
  10.     gpio_direction_output(SCL, 1); 
  11.     udelay(DELAY); 
  12.      
  13.     gpio_set_value(SDA, 0); 
  14.     udelay(DELAY);     
  15.            
  16.     gpio_set_value(SCL, 0); 
  17.     udelay(DELAY); 
  18. void i2c_stop(void
  19. {  
  20.     gpio_set_value(SCL, 0); 
  21.     gpio_set_value(SDA, 0); 
  22.     udelay(DELAY); 
  23.      
  24.     gpio_set_value(SCL, 1); 
  25.     udelay(DELAY); 
  26.     gpio_set_value(SDA, 1); 
  27.     udelay(DELAY); 
  28. void i2c_send_ack(u8 ack) 
  29.     if(ack) 
  30.         gpio_direction_output(SDA, 1);  
  31.     else  
  32.         gpio_direction_output(SDA, 0); 
  33.     udelay(DELAY); 
  34.      
  35.     gpio_set_value(SCL, 1); 
  36.     udelay(DELAY); 
  37.      
  38.     gpio_set_value(SCL, 0); 
  39.     udelay(DELAY);   
  40. u8 i2c_receive_ack(void
  41.     u8 rc = 0; 
  42.      
  43.     gpio_direction_input(SDA); 
  44.     gpio_set_value(SCL, 1); 
  45.     udelay(DELAY); 
  46.      
  47.     if(gpio_get_value(SDA)) { 
  48.         rc = 1; 
  49.     } 
  50.     gpio_set_value(SCL, 0); 
  51.     gpio_direction_output(SDA, 1);               
  52.     return rc; 
  53. u8 i2c_send_byte(u8 send_byte) 
  54.     u8 rc = 0; 
  55.     u8 out_mask = 0x80; 
  56.     u8 value; 
  57.     u8 count = 8; 
  58.     while(count > 0) {                 
  59.         value = ((send_byte & out_mask) ? 1 : 0);    
  60.         if (value == 1) {                                    
  61.             gpio_set_value(SDA, 1);      
  62.         }     
  63.         else {                                   
  64.             gpio_set_value(SDA, 0); 
  65.         }     
  66.         udelay(DELAY); 
  67.                                    
  68.         gpio_set_value(SCL, 1);                      
  69.         udelay(DELAY); 
  70.                       
  71.         gpio_set_value(SCL, 0);      
  72.         udelay(DELAY); 
  73.                    
  74.         out_mask >>= 1;       
  75.         count--;        
  76.     } 
  77.      
  78.     gpio_set_value(SDA, 1);   
  79.     rc = i2c_receive_ack(); 
  80.     return rc; 
  81. void i2c_read_byte(u8 *buffer, u8 ack) 
  82.     u8 count = 0x08; 
  83.     u8 data = 0x00; 
  84.     u8 temp = 0; 
  85.      
  86.     gpio_direction_input(SDA);  
  87.     while(count > 0) { 
  88.         gpio_set_value(SCL, 1); 
  89.         udelay(DELAY); 
  90.         temp = gpio_get_value(SDA);      
  91.         data <<= 1; 
  92.         if (temp) 
  93.             data |= 0x01; 
  94.         gpio_set_value(SCL, 0); 
  95.         udelay(DELAY); 
  96.         count--; 
  97.     } 
  98.     i2c_send_ack(ack);//0 = ACK    1 = NACK 
  99.     *buffer = data;          
  100. //向client的某个寄存器写入多个字节,len是要写入的数据的长度  
  101. u8 i2c_write(u8 device_id, u8 reg_address, u8* data, u8 len) 
  102.     u8 rc = 0; 
  103.     u8 i; 
  104.     i2c_start();   
  105.      
  106.     rc |= i2c_send_byte( (device_id << 1) | 0x00 ); 
  107.     rc |= i2c_send_byte(reg_address); 
  108.     if(data==NULL ||0==len) { 
  109.         i2c_stop(); 
  110.         return rc; 
  111.     } 
  112.          
  113.     for(i=0; i<len; i++) { 
  114.         rc |= i2c_send_byte(*data); 
  115.         data++; 
  116.     } 
  117.      
  118.     i2c_stop();      
  119.     if(rc) { 
  120.         printk("ERROR!  ssd2531_i2c_write failed/n"); 
  121.     } 
  122.     return rc;   
  123. //从某个register中读取len个字节放在长度为len的缓冲区buffer中 
  124. u8 i2c_read(u8 device_id, u8 reg_address, u8 *buffer, u8 len) 
  125.     u8 rc = 0; 
  126.     u8 i; 
  127.      
  128.     i2c_start();   
  129.     rc |= i2c_send_byte( (device_id << 1) | 0x00 ); 
  130.     rc |= i2c_send_byte(reg_address); 
  131.     i2c_start();//restart I2C     
  132.     rc |= i2c_send_byte( (device_id << 1) | 0x01 ); 
  133.      
  134.     for(i=0;i<len;i++) { 
  135.         i2c_read_byte(buffer++, !(len-i-1));//  !(len-i-1)  这个用来保证在读到每个字节后发送一个ACK并能在最后一个字节读完后发送一个NACK 
  136.     } 
  137.      
  138.     i2c_stop();  
  139.     if(rc) { 
  140.         printk("ERROR!   ssd2531_i2c_read failed/n"); 
  141.         return rc; 
  142.     } 
  143.     return rc;   
  144. /****I2C*****I2C*****I2C*****I2C*****I2C*****I2C*****I2C*****I2C*****I2C*****I2C*****I2C****/ 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值