中断程序操作I2C问题

duapy 2009-09-27 03:24:27
在一中断程序中,调用I2C接口 DeviceIoControl();在I2C驱动中打印总线读出的值都是正确的,为啥中断中返回值不对?? 还请各位帮忙 ,谢谢 !!
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
puc = (PUCHAR)MapPtrToProcess(((PI2C_IO_DESC)pBufIn)->Data, pI2C->hProc);
{
//中断中不能访问puc,故用临时变量ptemp
DWORD size = ((PI2C_IO_DESC)pBufIn)->Count;
LPVOID ptemp = NULL;
if(size) ptemp = malloc(size);
dwErr = HW_Read(pI2C,
((PI2C_IO_DESC)pBufIn)->SlaveAddr,
((PI2C_IO_DESC)pBufIn)->WordAddr,
ptemp,
size);
RETAILMSG(1, (L" HW_Read = %x \r\n",(*(DWORD *)ptemp))); if(ptemp)
{
memcpy(puc,ptemp,size);
free(ptemp);
}
}
RETAILMSG(1, (L" HW_Read = %x \r\n",*puc)); UnMapPtr(puc);
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
...全文
310 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
duapy 2009-10-12
  • 打赏
  • 举报
回复
打印语句问题 。。。写错了,郁闷 。。。
afantii 2009-09-29
  • 打赏
  • 举报
回复
你是用AXP这个芯片吗?我也是,这个东西很不错。
wangyan_ua 2009-09-28
  • 打赏
  • 举报
回复
刚才没明白,说的不对。我猜的,你用createfile,那IoControl的dll应该是udevice加载的,加载的地址空间和你现在的不一样。可是你((PI2C_IO_DESC)pBufIn)->Data是currentProcess空间的地址,不能够不经转换直接传进去。要验证很容易,你在pBufIn->data这个地址上写点东西,然后在iocontrol里检查是不是一样的

msdn上MapPtrToProcess的说明应该有帮助
http://msdn.microsoft.com/en-us/library/ms886751.aspx
wangyan_ua 2009-09-28
  • 打赏
  • 举报
回复
这个isr的写法我也看不太明白,但是觉得有些诡异。这个((PI2C_IO_DESC)pBufIn)->Data是不是个io memory啊,如果是的话,映射到process并没有分配main memory,实际物理地址还是在io,可后面又往里memcpy。就算这样可以,最后又把映射取消了,虚拟地址一旦释放,process还怎么去访问。
-小仙- 2009-09-28
  • 打赏
  • 举报
回复
读到的数据是放在(((PI2C_IO_DESC)pBufIn)->Data
即puc地址里面的,

typedef struct _I2C_IO_DESC {
DWORD SlaveAddr; // Target Slave Address
UCHAR WordAddr; // Starting Slave Word Address
PUCHAR Data; // pBuffer
DWORD Count; // nBytes to read/write
} I2C_IO_DESC, *PI2C_IO_DESC;


PI2C_IO_DESC *pread;
这个驱动的收发数据都是在上面这个结构的,
所以在APP里面就读 pread->Data 这个地址就可以了
-小仙- 2009-09-27
  • 打赏
  • 举报
回复
用查询吧
RockurSoul 2009-09-27
  • 打赏
  • 举报
回复
犹抱琵琶半遮面。。。。
duapy 2009-09-27
  • 打赏
  • 举报
回复
是在中断线程中,操作i2c总线。在i2c驱动中读到数据是正确的,但是DeviceIoControl 返回的数据不对
hI2C = CreateFile( L"I2C0:",
GENERIC_READ|GENERIC_WRITE,
0,
NULL, OPEN_EXISTING, 0, 0);
。。。。。。。。。。。。。。。。。。。。。

RETAILMSG(1, (TEXT("AXP::CreateFile(\"I2C0\") \r\n")));

axp182_reg.SlaveAddr = AXP_RD_ADDR;
axp182_reg.WordAddr = AXP_DC12_VSET;
axp182_reg.Count = 1;
ret = DeviceIoControl(hI2C, IOCTL_I2C_READ, &axp182_reg, sizeof(axp182_reg), axp182_reg.Data, 1, &retbyte, NULL);
if(!ret )
{
RETAILMSG(1, (TEXT("DeviceIoControl Failed(\"I2C0\") \r\n")));
}

RETAILMSG(1, (TEXT("DeviceIoControl Sucessed(\"I2C0\")%x \r\n")),*axp182_reg.Data);
xiaopi224 2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 duapy 的回复:]
在一中断程序中,调用I2C接口 DeviceIoControl();在I2C驱动中打印总线读出的值都是正确的,为啥中断中返回值不对?? 
[/Quote]

不太理解,说清楚点

ISR 不能返回一个值
duapy 2009-09-27
  • 打赏
  • 举报
回复
是开发板自带的驱动呀 ,读写芯片都是可以的,是应用程序和驱动传递参数的问题吗
-小仙- 2009-09-27
  • 打赏
  • 举报
回复
汗 我也在做I2C,你用的是BSP自带的驱动吧

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧