打印
[资料分享与下载]

Freescale P4080 I2C 驱动分析

[复制链接]
1358|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
跟屁虫|  楼主 | 2015-6-18 20:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
跟屁虫|  楼主 | 2015-6-18 20:33 | 只看该作者
    typedef struct fsl_i2c {  
      
        u8 adr;     /* I2C slave address */  
        u8 res0[3];  
    #define I2C_ADR     0xFE  
    #define I2C_ADR_SHIFT   1  
    #define I2C_ADR_RES ~(I2C_ADR)  
      
        u8 fdr;     /* I2C frequency divider register */  
        u8 res1[3];  
    #define IC2_FDR     0x3F  
    #define IC2_FDR_SHIFT   0  
    #define IC2_FDR_RES ~(IC2_FDR)  
      
        u8 cr;      /* I2C control redister */  
        u8 res2[3];  
    #define I2C_CR_MEN  0x80  
    #define I2C_CR_MIEN 0x40  
    #define I2C_CR_MSTA 0x20  
    #define I2C_CR_MTX  0x10  
    #define I2C_CR_TXAK 0x08  
    #define I2C_CR_RSTA 0x04  
    #define I2C_CR_BCST 0x01  
      
        u8 sr;      /* I2C status register */  
        u8 res3[3];  
    #define I2C_SR_MCF  0x80  
    #define I2C_SR_MAAS 0x40  
    #define I2C_SR_MBB  0x20  
    #define I2C_SR_MAL  0x10  
    #define I2C_SR_BCSTM    0x08  
    #define I2C_SR_SRW  0x04  
    #define I2C_SR_MIF  0x02  
    #define I2C_SR_RXAK 0x01  
      
        u8 dr;      /* I2C data register */  
        u8 res4[3];  
    #define I2C_DR      0xFF  
    #define I2C_DR_SHIFT    0  
    #define I2C_DR_RES  ~(I2C_DR)  
      
        u8 dfsrr;   /* I2C digital filter sampling rate register */  
        u8 res5[3];  
    #define I2C_DFSRR   0x3F  
    #define I2C_DFSRR_SHIFT 0  
    #define I2C_DFSRR_RES   ~(I2C_DR)  
      
        /* Fill out the reserved block */  
        u8 res6[0xE8];  
    } fsl_i2c_t;  

使用特权

评论回复
板凳
跟屁虫|  楼主 | 2015-6-18 20:34 | 只看该作者
    #define CONFIG_SYS_I2C_OFFSET       0x118000  
    #define CONFIG_SYS_I2C2_OFFSET      0x118100  
     #if defined CONFIG_SYS_NUM_OF_I2C  
      static unsigned int i2c_bus_speed[CONFIG_SYS_NUM_OF_I2C] = {CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SPEED,CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SPEED };  
      
       const struct fsl_i2c *i2c_dev[CONFIG_SYS_NUM_OF_I2C] = {  
          (struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_I2C_OFFSET),  
          (struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_I2C_OFFSET + 0x100),  
      #if defined(CONFIG_PPC_P4080)                // (dual) i2c module #2  
         (struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_I2C_OFFSET + 0x1000),  
          (struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_I2C_OFFSET + 0x1000 + 0x100)  
      #endif  
     };  

使用特权

评论回复
地板
跟屁虫|  楼主 | 2015-6-18 20:35 | 只看该作者
 void i2c_soft_reset(const struct fsl_i2c *dev )  
{  
     volatile u8 cTmp;  
   
         debug("\t@%08x:  I2CCSR:%02x I2CCCR:%02x  ", (int) dev, readb(&dev->sr), readb(&dev->cr));  
   
         /* per 11.5.6 of 8548 UM */  
        writeb(0x20, &dev->cr); //这里都是硬件规定,不要问为啥是0x20, 00100000这个值中已经申明了某一位置位  
         udelay(1000);  
         writeb(0xA0, &dev->cr);          /* start condition */  
         udelay(1000);  
   
         cTmp =  readb(&dev->dr);         /* kick off the read 8 data + ack */  
         debug("I2CCDR:%02x %s \n", cTmp, __FUNCTION__);  
   
         writeb(0x0, &dev->cr);             /* disable and leave it alone */  
         udelay(1000);  
   
}  

使用特权

评论回复
5
跟屁虫|  楼主 | 2015-6-18 20:35 | 只看该作者
 static int  i2c_wait4bus(void)  
{  
     unsigned long long timeval = get_ticks();  
    const unsigned long long timeout = usec2ticks(CONFIG_I2C_MBB_TIMEOUT);  
  
     while (readb(&i2c_dev[i2c_bus_num]->sr) & I2C_SR_MBB) {  
         if ((get_ticks() - timeval) > timeout)  
             return -1;  
     }  
   
     return 0;  
}  

使用特权

评论回复
6
跟屁虫|  楼主 | 2015-6-18 20:37 | 只看该作者
 static int i2c_write_addr (u8 dev, u8 dir, int rsta)  
{  
     writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX  
            | (rsta ? I2C_CR_RSTA : 0),  
            &i2c_dev[i2c_bus_num]->cr);  
   
     writeb((dev << 1) | dir, &i2c_dev[i2c_bus_num]->dr);  
   
     if (i2c_wait(I2C_WRITE_BIT) < 0)  
         return 0;  
   
     return 1;  
}  
   
// static __inline__ int  
static int __i2c_write(u8 *data, int length)  
{  
     int i;  
   
     for (i = 0; i < length; i++) {  
         writeb(data[i], &i2c_dev[i2c_bus_num]->dr);  
   
         if (i2c_wait(I2C_WRITE_BIT) < 0)  
            break;  
     }  
   
     return i;  
}  

使用特权

评论回复
7
跟屁虫|  楼主 | 2015-6-18 20:38 | 只看该作者
int   i2c_write(u8 dev, uint addr, int alen, u8 *data, int length)  
{  
     int i = -1; /* signal error */  
     u8 *a = (u8*)&addr;  
   
     if (i2c_wait4bus() >= 0  
         && i2c_write_addr(dev, I2C_WRITE_BIT, 0) != 0  
         && __i2c_write(&a[4 - alen], alen) == alen) {  
         i = __i2c_write(data, length);  
     }  
   
     writeb(I2C_CR_MEN, &i2c_dev[i2c_bus_num]->cr);  
     if (i2c_wait4bus()) /* Wait until STOP */  
         debug("i2c_write: wait4bus timed out\n");  
   
    if (i == length)  
        return 0;  
   
     return -1;  
}  

使用特权

评论回复
8
598330983| | 2015-6-18 22:07 | 只看该作者
IIC ,用的地方很多的,好多外设都是这个接口,很感谢楼主无私奉献。

使用特权

评论回复
9
cowboy2014| | 2015-6-19 08:42 | 只看该作者
这个代码和分析真是详细,虽然是转载的别人的

使用特权

评论回复
10
跟屁虫|  楼主 | 2015-6-21 21:25 | 只看该作者
只要资料对大家有用处我就是很高兴的

使用特权

评论回复
11
侣行天下| | 2015-6-21 21:38 | 只看该作者
楼主分享的东西讲解的很详细,能够直接拿过来用了

使用特权

评论回复
12
追逐浪花| | 2015-6-21 21:40 | 只看该作者
楼主分享的代码能够拿来直接用了,非常好

使用特权

评论回复
13
ccw1986| | 2015-6-21 21:57 | 只看该作者
代码和分析都有,这样的帖子最容易接受

使用特权

评论回复
14
FSL_TICS_ZJJ| | 2015-6-23 11:06 | 只看该作者
非常感谢你的经验分享!

使用特权

评论回复
15
李香兰| | 2015-6-23 13:55 | 只看该作者
这个讲的还是比较详细的,代码也有了

使用特权

评论回复
16
cowboy2014| | 2015-6-23 20:28 | 只看该作者
这个分析和代码还少比较详尽的

使用特权

评论回复
17
734774645| | 2015-6-23 21:31 | 只看该作者
typedef struct fsl_i2c {  
      
        u8 adr;     /* I2C slave address */  
        u8 res0[3];  
    #define I2C_ADR     0xFE  
    #define I2C_ADR_SHIFT   1  
    #define I2C_ADR_RES ~(I2C_ADR)  
      
        u8 fdr;     /* I2C frequency divider register */  
        u8 res1[3];  
    #define IC2_FDR     0x3F  
    #define IC2_FDR_SHIFT   0  
    #define IC2_FDR_RES ~(IC2_FDR)  
      
        u8 cr;      /* I2C control redister */  
        u8 res2[3];  
    #define I2C_CR_MEN  0x80  
    #define I2C_CR_MIEN 0x40  
    #define I2C_CR_MSTA 0x20  
    #define I2C_CR_MTX  0x10  
    #define I2C_CR_TXAK 0x08  
    #define I2C_CR_RSTA 0x04  
    #define I2C_CR_BCST 0x01  
      
        u8 sr;      /* I2C status register */  
        u8 res3[3];  
    #define I2C_SR_MCF  0x80  
    #define I2C_SR_MAAS 0x40  
    #define I2C_SR_MBB  0x20  
    #define I2C_SR_MAL  0x10  
    #define I2C_SR_BCSTM    0x08  
    #define I2C_SR_SRW  0x04  
    #define I2C_SR_MIF  0x02  
    #define I2C_SR_RXAK 0x01  
      
        u8 dr;      /* I2C data register */  
        u8 res4[3];  
    #define I2C_DR      0xFF  
    #define I2C_DR_SHIFT    0  
    #define I2C_DR_RES  ~(I2C_DR)  
      
        u8 dfsrr;   /* I2C digital filter sampling rate register */  
        u8 res5[3];  
    #define I2C_DFSRR   0x3F  
    #define I2C_DFSRR_SHIFT 0  
    #define I2C_DFSRR_RES   ~(I2C_DR)  
      
        /* Fill out the reserved block */  
        u8 res6[0xE8];  
    } fsl_i2c_t;  
这个东西太长了。

使用特权

评论回复
18
春风的暖暖| | 2015-6-24 08:25 | 只看该作者
资料虽然是转载的,但是也非常有用,谢谢楼主了

使用特权

评论回复
19
Messi1999| | 2015-6-24 08:28 | 只看该作者
正在找这样的例子,没想到在这里找到了,谢谢楼主

使用特权

评论回复
20
小猫爱吃鱼| | 2015-6-24 08:34 | 只看该作者
这些代码紧扣上面的说明,挺有用的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

245

帖子

2

粉丝