謝謝您的回答。但我還是有點(diǎn)不明白,那為什么在CH454的一個(gè)例子中就是把地址定為0x40那 為什么這么定義那?程序中是這樣的: // 2線接口的CH454定義 #define CH454_I2C_ADDR 0x40 // CH454的地址 #define CH454_I2C_MASK 0x3E // CH454的2線接口高字節(jié)命令掩碼 如果我把CH454跟ARM板子接起來(lái) 那我訪問(wèn)CH454是不是就通過(guò)自定義的那個(gè)地址那?? 就是不明白這個(gè)地址怎么來(lái)的 還請(qǐng)您指點(diǎn)。。。。
以CH454pdf的第5頁(yè)的操作命令表的設(shè)定系統(tǒng)參數(shù)項(xiàng)為例, UploadImages/200811201655348.rar 位12-位9 是0x04。 調(diào)用ch454_write函數(shù)發(fā)送0x0401操作命令給CH454,第一個(gè)字節(jié)是0x04,第二個(gè)字節(jié)是0x01。 ch454_write函數(shù)會(huì)先調(diào)用CH454_I2c_WrByte來(lái)發(fā)送第一個(gè)字節(jié), CH454_I2c_WrByte((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR); 參照CH454pdf的第4頁(yè)尾的時(shí)序圖, UploadImages/200811201652831.rar 經(jīng)過(guò)了((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR這個(gè)變換,實(shí)際發(fā)送的操作命令的第一個(gè)字節(jié)0x04變?yōu)?x48 這樣實(shí)際發(fā)送的操作命令是0x4801。 建議您仔細(xì)閱讀下CH454的PDF,就會(huì)明白這是怎么回事了。
AShin: 您好! 感謝您的回答,在您上邊的回答中我還是有個(gè)問(wèn)題不明白。 ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR 其中CH454_I2C_ADDR怎么設(shè)??? 如果我讓它跟單片機(jī)相連,那CH454_I2C_ADDR是怎么來(lái)的那? CH454_I2C_MASK是干嗎用的? 干嗎的經(jīng)過(guò)((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR變換哪??? 不好意思 很菜,請(qǐng)您幫忙?
還有一個(gè)問(wèn)題,為什么只取位12-位9哪?15,14 不是固定為0和1 嗎 您為什么只用位12-位9那? 請(qǐng)您指點(diǎn)。。。。。謝謝,,,,謝謝。。。。。
#define CH454_RESET 0x0201 // 復(fù)位 #define CH454_CLR_BIT 0x0180 // 段位清0,需另加6位數(shù)據(jù) #define CH454_SET_BIT 0x01C0 // 段位置1,需另加6位數(shù)據(jù) #define CH454_NO_BCD 0x0500 // 設(shè)置直接譯碼方式 #define CH454_TWINKLE 0x0600 // 設(shè)置閃爍控制,需另加8位數(shù)據(jù) #define CH454_GET_KEY 0x0700 // 獲取按鍵,返回按鍵代碼 #define CH454_DIG0_LO 0x0800 // 數(shù)碼管位0LO顯示,需另加8位數(shù)據(jù) #define CH454_DIG1_LO 0x0900 // 數(shù)碼管位1LO顯示,需另加8位數(shù)據(jù) #define CH454_DIG2_LO 0x0a00 // 數(shù)碼管位2LO顯示,需另加8位數(shù)據(jù) #define CH454_DIG3_LO 0x0b00 // 數(shù)碼管位3LO顯示,需另加8位數(shù)據(jù) #define CH454_DIG4_LO 0x0c00 // 數(shù)碼管位4LO顯示,需另加8位數(shù)據(jù) #define CH454_DIG5_LO 0x0d00 // 數(shù)碼管位5LO顯示,需另加8位數(shù)據(jù) #define CH454_DIG6_LO 0x0e00 // 數(shù)碼管位6LO顯示,需另加8位數(shù)據(jù) #define CH454_DIG7_LO 0x0f00 // 數(shù)碼管位7LO顯示,需另加8位數(shù)據(jù) #define CH454_DIG0_HI 0x1000 // 數(shù)碼管位0HI顯示,需另加8位數(shù)據(jù) #define CH454_DIG1_HI 0x1100 // 數(shù)碼管位1HI顯示,需另加8位數(shù)據(jù) #define CH454_DIG2_HI 0x1200 // 數(shù)碼管位2HI顯示,需另加8位數(shù)據(jù) #define CH454_DIG3_HI 0x1300 // 數(shù)碼管位3HI顯示,需另加8位數(shù)據(jù) #define CH454_DIG4_HI 0x1400 // 數(shù)碼管位4HI顯示,需另加8位數(shù)據(jù) #define CH454_DIG5_HI 0x1500 // 數(shù)碼管位5HI顯示,需另加8位數(shù)據(jù) #define CH454_DIG6_HI 0x1600 // 數(shù)碼管位6HI顯示,需另加8位數(shù)據(jù) #define CH454_DIG7_HI 0x1700 // 數(shù)碼管位7HI顯示,需另加8位數(shù)據(jù)
#define CH454_I2C_ADDR 0x40 // CH454的地址 #define CH454_I2C_MASK 0x3E // CH454的2線接口高字節(jié)命令掩碼
例如 cmd = CH454_NO_BCD | 0x01 ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR 其實(shí)就是 ((UINT8)(0x0500>>7)&0x3E|0x40 經(jīng)過(guò)這個(gè)轉(zhuǎn)換為它實(shí)際發(fā)出的兩個(gè)字節(jié)命令。
CH454是兼容I2C協(xié)議的接口,不是標(biāo)準(zhǔn)的I2C接口。 CH454_I2C_ADDR 和 CH454_I2C_MASK只是為這種轉(zhuǎn)換而定義的,與標(biāo)準(zhǔn)的I2C協(xié)議沒(méi)有關(guān)系。 這里的CH454_I2C_ADDR與CH454的命令時(shí)序的ADDR位有關(guān),與您提到的I2C地址沒(méi)有關(guān)系。 這里的CH454_I2C_MASK只是為方便這種轉(zhuǎn)換而設(shè)定的,也沒(méi)什么特殊的意義。
您用I2C操作時(shí),只要參考例子修改一下就可以了,下面是我簡(jiǎn)單修改的AVR單片機(jī)的例子 UploadImages/2008112115532725.rar
謝謝您的回答。。。
不客氣。只用位12-位9才能滿足上面那個(gè)實(shí)際發(fā)送命令轉(zhuǎn)換。
Ashin: 您好! 您給我寫的例子我看了,還是有問(wèn)題需要您幫忙,我用的是ARM開發(fā)板,然后通過(guò)IIC擴(kuò)展出CH454來(lái)接鍵盤和8位的LED部分。我那開發(fā)板帶有IIC軟件包,需要地址尋址,比如ZLG7290的器件地址及尋址字節(jié)為0111000 R/W所以地址為0X70,那咱們這芯片地址是多少我還是不明白,如果作為從地址,那該時(shí)多少那? 不好意思 麻煩您了。。。。。
例如 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 是實(shí)際發(fā)出的第一個(gè)字節(jié)。
也就是說(shuō) ( ( ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR ) >> 1 ) 是實(shí)際器件地址, ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR )是實(shí)際器件地址+W, ((UINT8)(cmd>>7)&CH454_I2C_MASK|CH454_I2C_ADDR ) | 0x01 是實(shí)際器件地址+R。
我的ARM開發(fā)板需要從地址,就是這種格式的:比如ZLG7290的器件地址及尋址字節(jié)為0111000 R/W所以地址為0X70。而我使用你上述的方法調(diào)試程序時(shí),報(bào)告找不到CH454,需要具體的地址值。怎么回事呢???
CH454不是標(biāo)準(zhǔn)I2C器件,是兼容I2C時(shí)序。 報(bào)告找不到CH454是因?yàn)槟惆l(fā)送第一字節(jié)地址后,CH454返回的是NAK。不用理會(huì)這個(gè)報(bào)告,接著發(fā)送下一字節(jié)數(shù)據(jù)就可以了。 只做顯示功能的話,I2C接口是可以操作的。 做顯示功能和按鍵功能,要用GPIO口模擬I2C時(shí)序來(lái)操作。
那在問(wèn)一下 怎么模擬I2C 時(shí)序 ????? 沒(méi)做過(guò),以前用的都是標(biāo)準(zhǔn)的I2C芯片。 沒(méi)模擬過(guò)
論壇上提供的CH454例子就是用GPIO模擬I2C時(shí)序的。
器件的數(shù)據(jù)手冊(cè)很難讓人理解透徹,只能糊里糊涂的按例程來(lái),真難為那些寫例程的人。