pdk7105的I2C配置
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配置相关推荐
- I2C配置及调试流程
一.I2C配置 1.根据原理图,查找相关的i2c引脚对应的GPIO值,以GPIO10作为I2C_SDA,GPIO11作为I2C_SCL为例. 2.根据MSM8937 DEVICE SPECIFICAT ...
- ds90ub934 i2c 配置_DS90UB948-Q1:1080p 双路 FPD-Link III 解串器
DS90UB948-Q1:1080p 双路 FPD-Link III 解串器 DS90UB948-Q1 是一款 FPD-Link III 解串器,与 DS90UB949/947/929-Q1 串行器配 ...
- mstar 平台I2C 配置
芯片的pin 脚可以用作不同的功能,总结一句就是外设进行状态和数据交换. 最常用的是作为GPIO,设置为输出模式时,通过高低电平来控制一些外围设置: // 如LED,屏的电源,背光的开关,功放的静音等 ...
- STM32单片机初学者常用函数--I2C配置
I2C的配置必须要按照其时序逻辑,首先先来了解I2C常见的几种工作情况: A.主机向从机发送数据,数据传输方向在整个传输过程中不变: B.主机在第一个字节后,立即从从机读数据: C.在传输过程中,当需 ...
- 程序猿眼中的华为海思芯片!(华为海思芯片使用之I2C配置)
最近美帝从政府层面出手限制华为,作为经常使用华为海思产品的程序猿小编,觉得海思芯片有完整详细的datasheet,配置起来简单,也很容易上手.在这里分享一下海思芯片I2C的配置方法,希望能对大家使用海 ...
- ZYNQ linux环境下PS I2C配置OV5640
平台:ubuntu虚拟机 ZYNQ7035 1.vivado编辑BD文件,设置两个IIC接口 2.设备树搭建,应用petalinux调用hdf直接生成 在Ubuntu虚拟机内搭建工程 source / ...
- 05-SA8155 QNX通过QUB配置GPIO/INT/SPI/I2C/SPI等
1. 概述 1.1 概念 GENI 通用接口 (Generic interface) GSI 通用软件接口 (Generic software interface) QUP 高通通用外设 (Qualc ...
- STM32CubeMX配置I2C读取DS3231
使用HAL库操作DS3231 因为DSP2这个项目需要计时间功能所以封装了一下这个芯片的程序 硬件设计 我将它接到了I2C1对应的IO口是(SCL > PB6 | SDA > PB7) 程 ...
- SylixOS iMX6平台I2C总线驱动
原理概述 I2C总线驱动概述 I2C总线驱动是I2C适配器的软件实现,提供I2C适配器与从设备间完成数据通信的能力,比如起始,停止,应答信号和MasterXfer的实现函数.驱动程序包含初始化I2C总 ...
最新文章
- pandas使用query函数基于dataframe字符串数据列中字符串的长度筛选dataframe的数据行(specific column string length)
- where does the route config data of extension component come from
- 窗口程序ImageView(仿QQ图片查看器)
- 课时85.层叠性(掌握)
- 安装应用需要打开未知来源权限_打开安卓这个开关 不让流氓软件肆意妄为
- pthread_key_create
- 012-ViewState状态保持
- 使用RMAN传输表空间复制数据
- Ioc模式(又称DI:Dependency Injection 依赖注射)
- Python_Bool
- 【Maven】运行项目
- smale学习之数学表达式(day1)
- Sql server中 如何用sql语句创建视图
- mongodb与mysql优缺点
- 深圳市高级工商管理研究会成立大会成功召开
- 计算机中year函数怎么使用,excel2010中YEAR函数的使用方法
- retrofit 解析百度地图api 返回数据_基于百度地图API的城市数据采集方式
- css动画走马灯5秒,用animation制作走马灯
- odroid Xu4介绍
- hql 语句不能包含关键字