iic地址如何使用

谢谢您的回答。但我还是有点不明白,那为什么在CH454的一个例子中就是把地址定为0x40那 为什么这么定义那?程序中是这样的: // 2线接口的CH454定义 #define CH454_I2C_ADDR 0x40 // CH454的地址 #define CH454_I2C_MASK 0x3E // CH454的2线接口高字节命令掩码 如果我把CH454跟ARM板子接起来 那我访问CH454是不是就通过自定义的那个地址那?? 就是不明白这个地址怎么来的 还请您指点。。。。

以CH454pdf的第5页的操作命令表的设定系统参数项为例, UploadImages/200811201655348.rar 位12-位9 是0x04。 调用ch454_write函数发送0x0401操作命令给CH454,第一个字节是0x04,第二个字节是0x01。 ch454_write函数会先调用CH454_I2c_WrByte来发送第一个字节, CH454_I2c_WrByte((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR); 参照CH454pdf的第4页尾的时序图, UploadImages/200811201652831.rar 经过了((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR这个变换,实际发送的操作命令的第一个字节0x04变为0x48 这样实际发送的操作命令是0x4801。 建议您仔细阅读下CH454的PDF,就会明白这是怎么回事了。


AShin: 您好! 感谢您的回答,在您上边的回答中我还是有个问题不明白。 ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR 其中CH454_I2C_ADDR怎么设啊? 如果我让它跟单片机相连,那CH454_I2C_ADDR是怎么来的那? CH454_I2C_MASK是干吗用的? 干吗的经过((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR变换哪??? 不好意思 很菜,请您帮忙?


还有一个问题,为什么只取位12-位9哪?15,14 不是固定为0和1 吗 您为什么只用位12-位9那? 请您指点。。。。。谢谢,,,,谢谢。。。。。


#define CH454_RESET 0x0201 // 复位 #define CH454_CLR_BIT 0x0180 // 段位清0,需另加6位数据 #define CH454_SET_BIT 0x01C0 // 段位置1,需另加6位数据 #define CH454_NO_BCD 0x0500 // 设置直接译码方式 #define CH454_TWINKLE 0x0600 // 设置闪烁控制,需另加8位数据 #define CH454_GET_KEY 0x0700 // 获取按键,返回按键代码 #define CH454_DIG0_LO 0x0800 // 数码管位0LO显示,需另加8位数据 #define CH454_DIG1_LO 0x0900 // 数码管位1LO显示,需另加8位数据 #define CH454_DIG2_LO 0x0a00 // 数码管位2LO显示,需另加8位数据 #define CH454_DIG3_LO 0x0b00 // 数码管位3LO显示,需另加8位数据 #define CH454_DIG4_LO 0x0c00 // 数码管位4LO显示,需另加8位数据 #define CH454_DIG5_LO 0x0d00 // 数码管位5LO显示,需另加8位数据 #define CH454_DIG6_LO 0x0e00 // 数码管位6LO显示,需另加8位数据 #define CH454_DIG7_LO 0x0f00 // 数码管位7LO显示,需另加8位数据 #define CH454_DIG0_HI 0x1000 // 数码管位0HI显示,需另加8位数据 #define CH454_DIG1_HI 0x1100 // 数码管位1HI显示,需另加8位数据 #define CH454_DIG2_HI 0x1200 // 数码管位2HI显示,需另加8位数据 #define CH454_DIG3_HI 0x1300 // 数码管位3HI显示,需另加8位数据 #define CH454_DIG4_HI 0x1400 // 数码管位4HI显示,需另加8位数据 #define CH454_DIG5_HI 0x1500 // 数码管位5HI显示,需另加8位数据 #define CH454_DIG6_HI 0x1600 // 数码管位6HI显示,需另加8位数据 #define CH454_DIG7_HI 0x1700 // 数码管位7HI显示,需另加8位数据

#define CH454_I2C_ADDR 0x40 // CH454的地址 #define CH454_I2C_MASK 0x3E // CH454的2线接口高字节命令掩码

例如 cmd = CH454_NO_BCD | 0x01 ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR 其实就是 ((UINT8)(0x0500>>7)&0x3E|0x40 经过这个转换为它实际发出的两个字节命令。

CH454是兼容I2C协议的接口,不是标准的I2C接口。 CH454_I2C_ADDR 和 CH454_I2C_MASK只是为这种转换而定义的,与标准的I2C协议没有关系。 这里的CH454_I2C_ADDR与CH454的命令时序的ADDR位有关,与您提到的I2C地址没有关系。 这里的CH454_I2C_MASK只是为方便这种转换而设定的,也没什么特殊的意义。

您用I2C操作时,只要参考例子修改一下就可以了,下面是我简单修改的AVR单片机的例子 UploadImages/2008112115532725.rar


谢谢您的回答。。。


不客气。只用位12-位9才能满足上面那个实际发送命令转换。


Ashin: 您好! 您给我写的例子我看了,还是有问题需要您帮忙,我用的是ARM开发板,然后通过IIC扩展出CH454来接键盘和8位的LED部分。我那开发板带有IIC软件包,需要地址寻址,比如ZLG7290的器件地址及寻址字节为0111000 R/W所以地址为0X70,那咱们这芯片地址是多少我还是不明白,如果作为从地址,那该时多少那? 不好意思 麻烦您了。。。。。


例如 cmd = CH454_NO_BCD | 0x01 ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR

( ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR ) >> 1 是你的器件寻址地址, ( ( ( ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR ) >> 1 ) << 1 ) | R/W 是实际发出的第一个字节。

也就是说 ( ( ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR ) >> 1 ) 是实际器件地址, ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR )是实际器件地址+W, ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR ) | 0x01 是实际器件地址+R。


我的ARM开发板需要从地址,就是这种格式的:比如ZLG7290的器件地址及寻址字节为0111000 R/W所以地址为0X70。而我使用你上述的方法调试程序时,报告找不到CH454,需要具体的地址值。怎么回事呢???


CH454不是标准I2C器件,是兼容I2C时序。 报告找不到CH454是因为你发送第一字节地址后,CH454返回的是NAK。不用理会这个报告,接着发送下一字节数据就可以了。 只做显示功能的话,I2C接口是可以操作的。 做显示功能和按键功能,要用GPIO口模拟I2C时序来操作。


那在问一下 怎么模拟I2C 时序 啊??? 没做过,以前用的都是标准的I2C芯片。 没模拟过


论坛上提供的CH454例子就是用GPIO模拟I2C时序的。

UploadImages/20081124156476.rar


器件的数据手册很难让人理解透彻,只能糊里糊涂的按例程来,真难为那些写例程的人。


只有登录才能回复,可以选择微信账号登录