阅读:1726回复:13
我对7146 iic读的理解,帮我看看对不对?
/* 读I2C */
/* add : 器件地址 subadd: 内部地址 */ ULONG IICRead(BYTE add, BYTE subadd) { ULONG trans; #define START 0x3 #define CONT 0x2 #define STOP 0x1 #define NOP 0x0 add|=0x00010000; //read----add is 0x48 or 0x4a trans = (add << 24 ) | (subadd << 16 ) | ( START << 6 ) | ( CONT << 4 ) | ( STOP << 2 ) ; WriteReg(SAA7146_I2C_TRANSFER,trans); WriteReg(SAA7146_I2C_STATUS,0x500); WriteReg(SAA7146_MC2,(SAA7146_MC2_UPLD_I2C << 16 ) | 0xFFFF); } |
|
最新喜欢:![]()
|
沙发#
发布于:2002-06-17 13:02
>add|=0x00010000; //read----add is 0x48 or 0x4a
^^^^^^^^^^^^^^^delete >trans = (add << 24 ) | changed to: trans = ((add|0x01) << 24) | >(subadd << 16 ) | ok and insert: (add << 8) | >( START << 6 ) | ok, it\'s start read >( CONT << 4 ) | ok >( STOP << 2 ) ; ^^^^^^^^^^^^^(start<<2); //this means start write >WriteReg(SAA7146_I2C_TRANSFER,trans); ok >WriteReg(SAA7146_I2C_STATUS,0x500); ok >WriteReg(SAA7146_MC2,(SAA7146_MC2_UPLD_I2C << 16 ) | >0xFFFF); ok [编辑 - 6/17/02 by gung] |
|
板凳#
发布于:2002-06-17 14:00
这样对吗?好像读还是不行!!!
/* 写I2C */ /* add : 器件地址 subadd: 内部地址 value : 值 */ void IICWrite(BYTE add, BYTE subadd,BYTE value) { ULONG trans; #define START 0x3 #define CONT 0x2 #define STOP 0x1 #define NOP 0x0 trans = (add << 24 ) | (subadd << 16 ) | (value << 8 ) | ( START << 6 ) | ( CONT << 4 ) | ( STOP << 2 ) ; WriteReg(SAA7146_I2C_TRANSFER,trans); WriteReg(SAA7146_I2C_STATUS,0x500); WriteReg(SAA7146_MC2,(SAA7146_MC2_UPLD_I2C << 16 ) | 0xFFFF); } /* 读I2C */ /* add : 器件地址 subadd: 内部地址 */ BYTE IICRead(BYTE add, BYTE subadd) { ULONG trans; #define START 0x3 #define CONT 0x2 #define STOP 0x1 #define NOP 0x0 trans = ((add|0x01) << 24 ) | (subadd << 16 ) | (add << 8 ) | ( START << 6 ) | ( CONT << 4 ) | ( STOP << 2 ) ; WriteReg(SAA7146_I2C_TRANSFER,trans); WriteReg(SAA7146_I2C_STATUS,0x500); WriteReg(SAA7146_MC2,(SAA7146_MC2_UPLD_I2C << 16 ) | 0xFFFF); //好像trans值没变! trans=trans>>8; trans^=0x000000ff; return trans; } |
|
|
地板#
发布于:2002-06-17 15:01
1. 仔细看一下说明书,SAA7146_I2C_TRANSFER寄存器中三个字节发送顺序是反过来的。
2. 注意,读的过程应该是start write --> continue --> start read, 而不是start --> continue --> stop |
|
地下室#
发布于:2002-06-17 15:18
既然是读,最后总要把寄存器的值读回来阿
wait i2c to be programed; readreg(SAA7146_I2C_TRANSFER); getdata; |
|
5楼#
发布于:2002-06-17 15:18
既然是读,最后总要把寄存器的值读回来阿
wait i2c to be programed; wait i2c operation done readreg(SAA7146_I2C_TRANSFER); getdata; |
|
6楼#
发布于:2002-06-17 15:22
to:Guan
按你的意思,读应该这样:
trans = ((add|0x01) << 24 ) | (subadd << 16 ) | (add << 8 ) | ( START << 6 ) | ( CONT << 4 ) | ( START << 2 ) ; 可是这个该如何改呢? 1. 仔细看一下说明书,SAA7146_I2C_TRANSFER寄存器中三个字节发送顺序是反过来的。 |
|
|
7楼#
发布于:2002-06-17 17:35
trans = ((add|0x01) << 24 ) |
(subadd << 16 ) | (add << 8 ) | ( START << 6 ) | ( CONT << 4 ) | ( START << 2 ) ; 按照这个就对的 我说的反过来就是说: trans = ((add|0x01) << 24 ) | //第三个字节 (subadd << 16 ) | //第二个字节 (add << 8 ) | //第一个字节 ( START << 6 ) | //第三个字节为start read ( CONT << 4 ) | //第二个字节为continue ( START << 2 ) ; //第一个字节为start write 如果按照你原先的程序: trans = ((add|0x01) << 24 ) | (subadd << 16 ) | (add << 8 ) | ( START << 6 ) | ( CONT << 4 ) | ( STOP << 2 ) ; //第一个字节 第一个字节就stop了当然没有数据拉。 另外,ppl说得对,还要等待i2c完成再取数据。 即检测i2c_status的bit0是否为0。 |
|
8楼#
发布于:2002-06-18 09:53
那读到的数据在那里呢?
|
|
|
9楼#
发布于:2002-06-18 11:47
很对不起,我记错了,我重新看了一下以前的代码,应该是这样的:
WriteReg(I2C_STATUS, 0X500); WriteReg(MC2, 0x00010001); WriteReg(I2C_STATUS, 0X500); WriteReg(MC2, 0x00010001);//clear errors, usually twice trans = ((add) << 24 ) | //first (subadd << 16 ) | //second (add|0x01 << 8 ) | //third ( START << 6 ) | //start write ( CONT << 4 ) | //continue ( START << 2 ) ; //start read WriteReg(I2C_TRANSFER, trans); WriteReg(I2C_STATUS, 0x500); WriteReg(MC2, 0x00010001); While(ReadReg(I2C_STATUS) | 0x00000001); // waiting for unbusy if(ReadReg(I2C_STATUS) | 0x00000002) t << \"I2C Error\" << EOL; WriteReg(I2C_TRANSFER, 0x00000080); //continue to receive byte WriteReg(I2C_STATUS, 0x500); WriteReg(MC2, 0x00010001); //upload while(ReadReg(I2C_STATUS)| 0x00000001); if(ReadReg(I2C_STATUS) | 0x00000002) t << \"I2C Error\" << EOL; ByteReturned = (ReadReg(I2C_TRANSFER) & 0xff000000)>>24; [编辑 - 6/18/02 by gung] |
|
10楼#
发布于:2002-06-18 12:11
gung:留个qq吧!我的:76138572
没有的话我送你一个! |
|
|
11楼#
发布于:2002-06-18 13:00
2408481
|
|
12楼#
发布于:2002-06-20 10:51
gung:
大哥,为何qq不理我啊? |
|
|
13楼#
发布于:2007-01-02 22:56
While(ReadReg(I2C_STATUS) | 0x00000001);
这里 |应该换成&吧 |
|