首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

6410 iic 读写有关问题

2012-09-10 
6410 iic 读写问题网上说6410的iic驱动有些问题,根据网上的资料修改了一下驱动后,用网上下载的一个exe测试

6410 iic 读写问题
网上说6410的iic驱动有些问题,根据网上的资料修改了一下驱动后,用网上下载的一个exe测试程序随便读写都没有任何问题,网址如下:http://download.csdn.net/source/1488970
后来我自己研究下驱动后,根据自己的理解写了一个测试的代码,可以读写,但是读写的数据很不正常。代码如下:请做过的高手指点错误:


DWORD
HW_WriteRegisters(
  PUCHAR pBuff, // Optional buffer
UCHAR StartRegs,
  DWORD nRegs // number of registers
  )
{
UCHAR tmpbuf[512];
  DWORD dwErr=1;
  DWORD bytes;
  IIC_IO_DESC IIC_Data;
   
tmpbuf[0]=StartRegs;
memcpy(&tmpbuf[1],pBuff,nRegs);
   
  IIC_Data.SlaveAddress = CAMERA_WRITE;
  IIC_Data.Count = nRegs;
  IIC_Data.Data = tmpbuf;
   
  // use iocontrol to write
  if ( !DeviceIoControl(hI2C,
  IOCTL_IIC_WRITE, 
  &IIC_Data, sizeof(IIC_IO_DESC), 
  NULL, 0,
  &bytes, NULL) ) 
  {
  dwErr = 0;
  }  


  return dwErr;
}

DWORD
HW_ReadRegisters(
  PUCHAR pBuff, // Optional buffer
  UCHAR StartReg, // Start Register
  DWORD nRegs // Number of Registers
  )
{
  DWORD dwErr=1;
  DWORD bytes;
  IIC_IO_DESC IIC_AddressData, IIC_Data;

  IIC_AddressData.SlaveAddress = CAMERA_WRITE;
  IIC_AddressData.Data = &StartReg;
  IIC_AddressData.Count = 1;
   
  IIC_Data.SlaveAddress = CAMERA_WRITE;
  IIC_Data.Data = pBuff;
  IIC_Data.Count = 1;
   
  // use iocontrol to read  
  if ( !DeviceIoControl(hI2C,
  IOCTL_IIC_READ, 
  &IIC_AddressData, sizeof(IIC_IO_DESC), 
  &IIC_Data, sizeof(IIC_IO_DESC),
  &bytes, NULL) ) 
  {
  dwErr = 0;
  }  

   
  return dwErr;
}

int _tmain(int argc, _TCHAR* argv[])
{
DWORD i;
UCHAR bufin[100];
UCHAR bufout[100];
DWORD nbyte=100;
DWORD bytes;
UCHAR StartAddr=0x2;
UINT32 IICClock = 412500;
  UINT32 uiIICDelay;
for(i=0;i<100;i++)
bufin[i]=0;

bufin[0]=0x5;

hI2C = CreateFile( L"IIC0:",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, 0);
if ( INVALID_HANDLE_VALUE == hI2C ) 
{
  MessageBox (0,TEXT("Open Error!"),NULL,MB_OK);
  return FALSE;
  }
else
{
MessageBox (0,TEXT("Open !"),NULL,MB_OK);
}

if ( !DeviceIoControl(hI2C,
  IOCTL_IIC_SET_CLOCK, 
  &IICClock, sizeof(UINT32), 
  NULL, 0,
  &bytes, NULL) ) 
  {
  RETAILMSG(1,(TEXT("IOCTL_IIC_SET_CLOCK ERROR: %u \r\n")));
  return FALSE;
  }  
  uiIICDelay = Clk_5;

  if ( !DeviceIoControl(hI2C,
  IOCTL_IIC_SET_DELAY, 
  &uiIICDelay, sizeof(UINT32), 
  NULL, 0,
  &bytes, NULL) )
{
  RETAILMSG(1,(TEXT("IOCTL_IIC_SET_DELAY ERROR: %u \r\n")));


  return FALSE;
  }


//HW_WriteRegisters(&bufin[0],0,1);
HW_ReadRegisters(bufout,StartAddr,1);
CloseHandle(hI2C);

return 0;
}


程序大部分是参考camera驱动里的。


[解决办法]
楼主:读写的数据怎么不正常,能说明白点吗?
用6410的IIC写过CH7004(VGA)的控制命令,挺正常,没发现问题啊。但当时确实是不知道什么原因,把一块板子的IIC的接口给烧掉了。
[解决办法]
我看了_tmain函数中用DeviceIoControl函数两次,分别传递的控制码是IOCTL_IIC_SET_CLOCK和IOCTL_IIC_SET_DELAY,你这样做的目的是修改IIC接口的时钟和delay time吗?这两个时间不是IIC驱动中自己设置好了吗?你这样修改不知是否有副作用。
[解决办法]
IIC_IO_DESC IIC_Data;
IIC_Data.SlaveAddress = CAMERA_WRITE;
IIC_Data.Count = nRegs;
IIC_Data.Data = tmpbuf;

这个结构体里面的Data就是内嵌指针,有一种处理方法是在驱动里面分配一段缓存,暂定名字为buf
对于写入数据,先把.Data的数据复制到buf里,然后把缓存的指针传给HW_Write;对于读取数据将数据使用HW_Read读取到buf里,然后memcpy到.Data里传给应用。这种处理方法的缺点就是必须预先知道IIC传输数据的总长度。
另外一种处理方式我研究过,但是没有具体使用,只能给篇文章给你参考了:
http://blogs.msdn.com/b/ce_base/archive/2006/11/09/memory-marshalling-in-windows-ce.aspx
[解决办法]
中文版本的在这里:
http://www.armce.com/bbs/viewthread.php?tid=1210
[解决办法]
关注,我也在搞IIC的读写,也遇到了同样的问题,写IIC没问题,就是读的数据一直是错的。
[解决办法]
DWORD
HW_ReadRegisters(
PUCHAR pBuff, // Optional buffer
UCHAR StartReg, // Start Register
DWORD nRegs // Number of Registers
)
{
DWORD dwErr=0;
DWORD bytes;
IIC_IO_DESC IIC_AddressData;
IIC_IO_DESC IIC_Data;

IIC_AddressData.SlaveAddress = 0x1D; //CAMERA_READ
IIC_AddressData.Data = &StartReg;
IIC_AddressData.Count = 1;

IIC_Data.SlaveAddress = 0x1D;
IIC_Data.Data = pBuff;
IIC_Data.Count = 1;

// use iocontrol to read
if ( !DeviceIoControl(hI2C,
IOCTL_IIC_READ, 
&IIC_AddressData, sizeof(IIC_IO_DESC), 
&IIC_Data, sizeof(IIC_IO_DESC),
&bytes, NULL) ) 
{
dwErr = GetLastError();
RETAILMSG(1,(TEXT("IOCTL_IIC_WRITE ERROR: %u \r\n"), dwErr));
}


if ( !dwErr ) {
RETAILMSG(1,(TEXT("\n IIC_READ : %x\n"), IIC_Data ));
RETAILMSG(1,(TEXT("\n READ : %x\n"), pBuff ));


} else {
RETAILMSG(1,(TEXT("I2CRead ERROR: %u \r\n"), dwErr));
//DEBUGMSG(ZONE_ERR,(TEXT("I2CRead ERROR: %u \r\n"), dwErr));
}


return dwErr;
}


我这个跟你那个差不多的,也是参照 CAmera写的。
[解决办法]
关注,好像6410原始bsp就有这个问题。我的也是读问题,一直没时间修改

#define OV7725_SLAVE_ID 0x42
#define CAMERA_WRITE (OV7725_SLAVE_ID | 0x0)
#define CAMERA_READ (OV7725_SLAVE_ID | 0x1)

/********************************************************************
 * FUNCTION: IICReadByte
 * DESCRIPTION: IIC读
 * PARAMETERS: None
 * RETURNS:
 ********************************************************************/
DWORD IICReadByte(
PUCHAR pBuff, // Optional buffer
UCHAR StartReg, // Start Register
DWORD nRegs // Number of Registers
)
{
DWORD dwErr=0;
DWORD bytes;
HANDLE hI2C; // I2C Bus Driver
IIC_IO_DESC IIC_AddressData, IIC_Data;



// Initialize I2C Driver
hI2C = CreateFile( L"IIC0:",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, 0);

if ( INVALID_HANDLE_VALUE == hI2C ) 
{
printf("ReadPinDataRanges: Get size of dataranges NULL!\r\n");
return dwErr;
}

IIC_AddressData.SlaveAddress = CAMERA_WRITE;
IIC_AddressData.Data = &StartReg;
IIC_AddressData.Count = 1;

IIC_Data.SlaveAddress = CAMERA_READ;
IIC_Data.Data = pBuff;
IIC_Data.Count = 1;

// use iocontrol to read
if ( !DeviceIoControl(hI2C,
IOCTL_IIC_READ, 
&IIC_AddressData, sizeof(IIC_IO_DESC), 
&IIC_Data, sizeof(IIC_IO_DESC),
&bytes, NULL) ) 
{
dwErr = GetLastError();
}
CloseHandle(hI2C);
return dwErr;
}

热点排行