pdk7105的I2C配置
stm23-0047版本中增加了I2C的配置
<<include/configs/pdk7105.h>>
已知:
PIO3[4]  SCL
PIO3[5]  SDA
根据board/st/pdk7105.c代码中
static void configI2c(void)
{
 /*
  * The I2C busses are routed as follows:
  *
  * Bus   SCL    SDA
  * ---   ---    ---
  *  A PIO2[2]  PIO2[3]
  *  B PIO2[5]  PIO2[6]  Used only for SPI
  *  C PIO3[4]  PIO3[5]
  *  D PIO3[6]  PIO3[7]
  */
#if defined(CONFIG_I2C_BUS_A)   /* Use I2C Bus "A" */
 SET_PIO_PIN(PIO_PORT(2),2,STPIO_BIDIR); /* I2C_SCLA */
 SET_PIO_PIN(PIO_PORT(2),3,STPIO_BIDIR); /* I2C_SDAA */
#elif defined(CONFIG_I2C_BUS_C)   /* Use I2C Bus "C" */
 SET_PIO_PIN(PIO_PORT(3),4,STPIO_BIDIR); /* I2C_SCLC */
 SET_PIO_PIN(PIO_PORT(3),5,STPIO_BIDIR); /* I2C_SDAC */
#elif defined(CONFIG_I2C_BUS_D)   /* Use I2C Bus "D" */
 SET_PIO_PIN(PIO_PORT(3),6,STPIO_BIDIR); /* I2C_SCLD */
 SET_PIO_PIN(PIO_PORT(3),7,STPIO_BIDIR); /* I2C_SDAD */
#else
#error Unknown I2C Bus!
#endif
}
选用C总线,故定义CONFIG_I2C_BUS_C
SET_PIO_PIN(PIO_PORT(3),4,STPIO_BIDIR); /* I2C_SCLC */
SET_PIO_PIN(PIO_PORT(3),5,STPIO_BIDIR); /* I2C_SDAC */

#define SET_PIO_PIN(PIO_ADDR, PIN, DIR)     /
do {         /
 writel( PIN_C0((PIN),(DIR)),     /
  (PIO_ADDR)+STPIO_PC0_OFFSET+STPIO_SET_OFFSET);  /
 writel( PIN_C1((PIN),(DIR)),     /
  (PIO_ADDR)+STPIO_PC1_OFFSET+STPIO_SET_OFFSET);  /
 writel( PIN_C2((PIN),(DIR)),     /
  (PIO_ADDR)+STPIO_PC2_OFFSET+STPIO_SET_OFFSET);  /
 writel( CLEAR_PIN_C0((PIN),(DIR)),    /
  (PIO_ADDR)+STPIO_PC0_OFFSET+STPIO_CLEAR_OFFSET); /
 writel( CLEAR_PIN_C1((PIN),(DIR)),    /
  (PIO_ADDR)+STPIO_PC1_OFFSET+STPIO_CLEAR_OFFSET); /
 writel( CLEAR_PIN_C2((PIN),(DIR)),    /
  (PIO_ADDR)+STPIO_PC2_OFFSET+STPIO_CLEAR_OFFSET); /
} while (0)

#define PIN_C0(PIN, DIR) PIN_CX((PIN), (DIR), 0x01)
#define PIN_C1(PIN, DIR) PIN_CX((PIN), (DIR), 0x02)
#define PIN_C2(PIN, DIR) PIN_CX((PIN), (DIR), 0x04)
#define PIN_CX(PIN, DIR, X) (((PIN)==STPIO_NO_PIN) ? 0 : (((DIR) & (X))!=0) << (PIN))//将PIN口的位0,1,2置1
#define writel(b,addr) ((*(volatile u32 *) (addr)) = (b))//将b写入地址addr(long:32位)

SET_PIO_PIN(PIO_PORT(3),4,STPIO_BIDIR); /* I2C_SCLC */将ST40_PIO3_REGS_BASE(0xfd023000)的第4位置1
SET_PIO_PIN(PIO_PORT(3),5,STPIO_BIDIR); /* I2C_SDAC */将ST40_PIO3_REGS_BASE(0xfd023000)的第5位置1

SET_PIO_PIN(PIO_PORT(3),4,STPIO_BIDIR);//等价于*(0xfd023000)|=(1<<4)

extern void stx7105_i2c_scl(const int val)
{
#if defined(CONFIG_I2C_BUS_A)   /* Use I2C Bus "A" */
 STPIO_SET_PIN(PIO_PORT(2), 2, (val) ? 1 : 0);
#elif defined(CONFIG_I2C_BUS_C)   /* Use I2C Bus "C" */
 STPIO_SET_PIN(PIO_PORT(3), 4, (val) ? 1 : 0);
#elif defined(CONFIG_I2C_BUS_D)   /* Use I2C Bus "D" */
 STPIO_SET_PIN(PIO_PORT(3), 6, (val) ? 1 : 0);
#endif
}
stx7105_i2c_scl(const int val)设置PIO3[4]的值为val[0:1]

extern void stx7105_i2c_sda(const int val)
{
#if defined(CONFIG_I2C_BUS_A)   /* Use I2C Bus "A" */
 STPIO_SET_PIN(PIO_PORT(2), 3, (val) ? 1 : 0);
#elif defined(CONFIG_I2C_BUS_C)   /* Use I2C Bus "C" */
 STPIO_SET_PIN(PIO_PORT(3), 5, (val) ? 1 : 0);
#elif defined(CONFIG_I2C_BUS_D)   /* Use I2C Bus "D" */
 STPIO_SET_PIN(PIO_PORT(3), 7, (val) ? 1 : 0);
#endif
}
stx7105_i2c_sda(const int val)设置PIO3[5]值为val

extern int stx7105_i2c_read(void)
{
#if defined(CONFIG_I2C_BUS_A)   /* Use I2C Bus "A" */
 return STPIO_GET_PIN(PIO_PORT(2), 3);
#elif defined(CONFIG_I2C_BUS_C)   /* Use I2C Bus "C" */
 return STPIO_GET_PIN(PIO_PORT(3), 5);
#elif defined(CONFIG_I2C_BUS_D)   /* Use I2C Bus "D" */
 return STPIO_GET_PIN(PIO_PORT(3), 7);
#endif
}
stx7105_i2c_read(void)获取PIO3[5]的值STPIO_GET_PIN(PIO_PORT(3),5)

/*----------------------------------------------------------------------
 * I2C configuration
 */

#define CONFIG_CMD_I2C    /* do we want I2C support ? */

#if defined(CONFIG_CMD_I2C)
# define CONFIG_I2C_BUS_C   /* Use I2C Bus "C" */
# define CONFIG_I2C_CMD_TREE  /* use a "i2c" root command */
# define CFG_I2C_SLAVE  0x7F /* I2C slave address */ /* QQQ - TO CHECK */
# define CONFIG_SOFT_I2C   /* I2C with S/W bit-banging */
# undef  CONFIG_HARD_I2C   /* I2C withOUT hardware support */
# define I2C_ACTIVE   /* open-drain, nothing to do */
# define I2C_TRISTATE   /* open-drain, nothing to do */
# define I2C_SCL(val)  do { stx7105_i2c_scl((val)); } while (0)
# define I2C_SDA(val)  do { stx7105_i2c_sda((val)); } while (0)
# define I2C_READ   stx7105_i2c_read()

/*
  * The "BOGOS" for NDELAY() may be calibrated using the
  * following code fragment, and measuring (using an oscilloscope)
  * the frequency of the I2C SCL pin, and adjusting
  * NDELAY_BOGOS, until the SCL is approximately 100 kHz.
  * (100kHz has a period of 5us + 5us).
  *
  * printf("just toggling I2C SCL (100kHz frequency) .../n");
  * while (1)
  * {
  *  I2C_SCL(1); NDELAY(5000);
  *  I2C_SCL(0); NDELAY(5000);
  * }
  */
# define NDELAY_BOGOS  22 /* Empirical measurement for 1ns */
# define NDELAY(ns)      /
  do {       /
   const unsigned n_bogo = NDELAY_BOGOS;  /
   const unsigned n_ticks =    /
    ((ns)<n_bogo) ? 1u : (ns)/n_bogo; /
   volatile unsigned n_count;   /
   for(n_count=0; n_count<n_ticks; n_count++) /
    ; /* do nothing */  /
  } while(0)

/*
  * Note there are 4 * I2C_DELAY per I2C clock cycle
  * So, 400 kHz requires an I2C delay of 625 ns.
  * However, this calculation only works if the S/W
  * overhead in I2C bit-banging is negligible - which it is not!
  * So, in practice, either I2C_DELAY or CFG_I2C_SPEED will be lower.
  * The higher the clock frequency, the greater the difference.
  * Empirical measurement/adjustment is recommended.
  */
# define CFG_I2C_SPEED 400000    /* I2C speed (Hz) */
# define I2C_DELAY do { NDELAY(625); } while (0) /* 625 ns */
#endif /* CONFIG_CMD_I2C */

#endif /* __CONFIG_H */

I2C_SCL(1)   SCL置高
I2C_SDA(val)  SDA
NDELAY(ns)
# define I2C_READ   stx7105_i2c_read() STPIO_GET_PIN(PIO_PORT(3), 5);

 I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
  开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
  结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
  应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。
若未收到应答信号,由判断为受控单元出现故障。

pdk7105的I2C配置相关推荐

  1. I2C配置及调试流程

    一.I2C配置 1.根据原理图,查找相关的i2c引脚对应的GPIO值,以GPIO10作为I2C_SDA,GPIO11作为I2C_SCL为例. 2.根据MSM8937 DEVICE SPECIFICAT ...

  2. ds90ub934 i2c 配置_DS90UB948-Q1:1080p 双路 FPD-Link III 解串器

    DS90UB948-Q1:1080p 双路 FPD-Link III 解串器 DS90UB948-Q1 是一款 FPD-Link III 解串器,与 DS90UB949/947/929-Q1 串行器配 ...

  3. mstar 平台I2C 配置

    芯片的pin 脚可以用作不同的功能,总结一句就是外设进行状态和数据交换. 最常用的是作为GPIO,设置为输出模式时,通过高低电平来控制一些外围设置: // 如LED,屏的电源,背光的开关,功放的静音等 ...

  4. STM32单片机初学者常用函数--I2C配置

    I2C的配置必须要按照其时序逻辑,首先先来了解I2C常见的几种工作情况: A.主机向从机发送数据,数据传输方向在整个传输过程中不变: B.主机在第一个字节后,立即从从机读数据: C.在传输过程中,当需 ...

  5. 程序猿眼中的华为海思芯片!(华为海思芯片使用之I2C配置)

    最近美帝从政府层面出手限制华为,作为经常使用华为海思产品的程序猿小编,觉得海思芯片有完整详细的datasheet,配置起来简单,也很容易上手.在这里分享一下海思芯片I2C的配置方法,希望能对大家使用海 ...

  6. ZYNQ linux环境下PS I2C配置OV5640

    平台:ubuntu虚拟机 ZYNQ7035 1.vivado编辑BD文件,设置两个IIC接口 2.设备树搭建,应用petalinux调用hdf直接生成 在Ubuntu虚拟机内搭建工程 source / ...

  7. 05-SA8155 QNX通过QUB配置GPIO/INT/SPI/I2C/SPI等

    1. 概述 1.1 概念 GENI 通用接口 (Generic interface) GSI 通用软件接口 (Generic software interface) QUP 高通通用外设 (Qualc ...

  8. STM32CubeMX配置I2C读取DS3231

    使用HAL库操作DS3231 因为DSP2这个项目需要计时间功能所以封装了一下这个芯片的程序 硬件设计 我将它接到了I2C1对应的IO口是(SCL > PB6 | SDA > PB7) 程 ...

  9. SylixOS iMX6平台I2C总线驱动

    原理概述 I2C总线驱动概述 I2C总线驱动是I2C适配器的软件实现,提供I2C适配器与从设备间完成数据通信的能力,比如起始,停止,应答信号和MasterXfer的实现函数.驱动程序包含初始化I2C总 ...

最新文章

  1. pandas使用query函数基于dataframe字符串数据列中字符串的长度筛选dataframe的数据行(specific column string length)
  2. where does the route config data of extension component come from
  3. 窗口程序ImageView(仿QQ图片查看器)
  4. 课时85.层叠性(掌握)
  5. 安装应用需要打开未知来源权限_打开安卓这个开关 不让流氓软件肆意妄为
  6. pthread_key_create
  7. 012-ViewState状态保持
  8. 使用RMAN传输表空间复制数据
  9. Ioc模式(又称DI:Dependency Injection 依赖注射)
  10. Python_Bool
  11. 【Maven】运行项目
  12. smale学习之数学表达式(day1)
  13. Sql server中 如何用sql语句创建视图
  14. mongodb与mysql优缺点
  15. 深圳市高级工商管理研究会成立大会成功召开
  16. 计算机中year函数怎么使用,excel2010中YEAR函数的使用方法
  17. retrofit 解析百度地图api 返回数据_基于百度地图API的城市数据采集方式
  18. css动画走马灯5秒,用animation制作走马灯
  19. odroid Xu4介绍
  20. hql 语句不能包含关键字

热门文章

  1. 将CityScapes数据集转换为COCO格式的实例分割数据集
  2. 【信号处理】一种热电偶信号处理算法
  3. VC真彩工具栏制作浅析
  4. ctfshow 吃瓜杯 web 部分题
  5. xp怎么查看其它计算机共享,局域网内xp如何查看win7 的共享文件
  6. eyebeam高级设置
  7. app支持微信跳转下载的方式
  8. Nacos安装包下载及配置使用,附下载百度云连接
  9. 对一个信号添加带限高斯白噪声 Matlab实现
  10. windows 恢复误删文件