Xman
驱动大牛
驱动大牛
  • 注册日期2001-08-24
  • 最后登录2011-10-07
  • 粉丝0
  • 关注0
  • 积分343分
  • 威望127点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
阅读:1727回复:13

我对7146 iic读的理解,帮我看看对不对?

楼主#
更多 发布于:2002-06-17 11:37
/* 读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);
}

最新喜欢:

badluckybadluc...
[img]http://www.driverdevelop.com/forum/upload/Xman/2004-04-05_2004324183110706.jpg[/img]
bagpacker
驱动牛犊
驱动牛犊
  • 注册日期2006-11-13
  • 最后登录2007-10-18
  • 粉丝0
  • 关注0
  • 积分275分
  • 威望33点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-01-02 22:56
While(ReadReg(I2C_STATUS) | 0x00000001);
这里 |应该换成&吧
Xman
驱动大牛
驱动大牛
  • 注册日期2001-08-24
  • 最后登录2011-10-07
  • 粉丝0
  • 关注0
  • 积分343分
  • 威望127点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-20 10:51
gung:
大哥,为何qq不理我啊?
[img]http://www.driverdevelop.com/forum/upload/Xman/2004-04-05_2004324183110706.jpg[/img]
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-18 13:00
2408481
Xman
驱动大牛
驱动大牛
  • 注册日期2001-08-24
  • 最后登录2011-10-07
  • 粉丝0
  • 关注0
  • 积分343分
  • 威望127点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-18 12:11
gung:留个qq吧!我的:76138572
没有的话我送你一个!
[img]http://www.driverdevelop.com/forum/upload/Xman/2004-04-05_2004324183110706.jpg[/img]
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于: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]
Xman
驱动大牛
驱动大牛
  • 注册日期2001-08-24
  • 最后登录2011-10-07
  • 粉丝0
  • 关注0
  • 积分343分
  • 威望127点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-18 09:53
那读到的数据在那里呢?
[img]http://www.driverdevelop.com/forum/upload/Xman/2004-04-05_2004324183110706.jpg[/img]
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
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。


Xman
驱动大牛
驱动大牛
  • 注册日期2001-08-24
  • 最后登录2011-10-07
  • 粉丝0
  • 关注0
  • 积分343分
  • 威望127点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-17 15:22
to:Guan
按你的意思,读应该这样:

2. 注意,读的过程应该是start write --> continue --> start read, 而不是start --> continue --> stop

trans = ((add|0x01) << 24 ) |
(subadd << 16 ) |
(add << 8 ) |
( START << 6 ) |
( CONT << 4 ) |
( START << 2 ) ;


可是这个该如何改呢?
 
1. 仔细看一下说明书,SAA7146_I2C_TRANSFER寄存器中三个字节发送顺序是反过来的。
[img]http://www.driverdevelop.com/forum/upload/Xman/2004-04-05_2004324183110706.jpg[/img]
ppl
ppl
驱动小牛
驱动小牛
  • 注册日期2001-06-13
  • 最后登录2006-05-21
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-06-17 15:18
既然是读,最后总要把寄存器的值读回来阿

wait i2c to be programed;

wait i2c operation done
readreg(SAA7146_I2C_TRANSFER);

getdata;

ppl
ppl
驱动小牛
驱动小牛
  • 注册日期2001-06-13
  • 最后登录2006-05-21
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-06-17 15:18
既然是读,最后总要把寄存器的值读回来阿

wait i2c to be programed;

readreg(SAA7146_I2C_TRANSFER);

getdata;

gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-06-17 15:01
1. 仔细看一下说明书,SAA7146_I2C_TRANSFER寄存器中三个字节发送顺序是反过来的。
2. 注意,读的过程应该是start write --> continue --> start read, 而不是start --> continue --> stop
Xman
驱动大牛
驱动大牛
  • 注册日期2001-08-24
  • 最后登录2011-10-07
  • 粉丝0
  • 关注0
  • 积分343分
  • 威望127点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
12楼#
发布于: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;
}
[img]http://www.driverdevelop.com/forum/upload/Xman/2004-04-05_2004324183110706.jpg[/img]
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
13楼#
发布于: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]
游客

返回顶部