Wince6.0 WriteFile 延时

泥巴   2010-5-14 19:56 楼主
写一个打印机的驱动,用到SPI接口;
然后就在驱动里直接调用BSP包自带的SPI驱动,当用WriteFile写SPI时,从调用WriteFile开始,到正真出现CLK传送数据之前竟然有5ms的延时。
1、一包传送48个Bytes,从出现CLK到CLK(真正传送数据的时间)结束也就5个us不到;
2、我是在WriteFile之前置一个IO口,然后再调用完WriteFile之后又置一次IO用示波器测得的上述结果;
3、现在SPI采用的是FIFO模式,正打算换成DMA或INT模式试试,但估计作用不大;
4、怀疑是WriteFile函数本身的延时所致,就跟ISR到IST的延时一样。

平台为S3C6410,SPI的CLK为2分频,设为21Mhz,另外调用WriteFIle的线程优先级为0,时间片选也为0。

哪位大侠能对上面的延时有个合理的解释,谢谢~

回复评论 (10)

createfile 默认是有缓存的,ms修改最后一个参数就可以直接写而不使用缓存
点赞  2010-5-14 20:13
没明白xuejingzhupu的意思,我是在说WriteFile啊,能否说详细点,谢谢
引用: 引用 1 楼 xunjingzhpu 的回复:
createfile 默认是有缓存的,ms修改最后一个参数就可以直接写而不使用缓存
点赞  2010-5-14 23:19
引用: 引用 2 楼 haiou_arm 的回复:
没明白xuejingzhupu的意思,我是在说WriteFile啊,能否说详细点,谢谢

引用 1 楼 xunjingzhpu 的回复:
createfile 默认是有缓存的,ms修改最后一个参数就可以直接写而不使用缓存

writefile 之前不是有createfile吗,修改倒数第二个参数为FILE_FLAG_NO_BUFFERING,这回详细了吧
点赞  2010-5-15 09:17
刚按照楼上的方法试了下,还是没有效果……
  1.         hSpi = CreateFile(TEXT("SPI1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH, 0);
  2.     if (hSpi == INVALID_HANDLE_VALUE)
  3.     {
  4.         RETAILMSG(PRT_DUG,(TEXT("[PRT] Can't Open SPI!!!\n")));
  5.                 CloseHandle(hSpi);
  6.         return;
  7.     }

点赞  2010-5-15 09:52
引用: 引用 3 楼 xunjingzhpu 的回复:
引用 2 楼 haiou_arm 的回复:
没明白xuejingzhupu的意思,我是在说WriteFile啊,能否说详细点,谢谢

引用 1 楼 xunjingzhpu 的回复:
createfile 默认是有缓存的,ms修改最后一个参数就可以直接写而不使用缓存

writefile 之前不是有createfile吗,修改倒数第二个参数为FILE_FLAG_NO_BUFFERING,……


WinCE 下 CreateFile 不支持 FILE_FLAG_NO_BUFFERING
点赞  2010-5-15 09:53
msdn帮助里Wince确实是不支持!

引用: 引用 5 楼 aaa_tnt 的回复:
引用 3 楼 xunjingzhpu 的回复:
引用 2 楼 haiou_arm 的回复:
没明白xuejingzhupu的意思,我是在说WriteFile啊,能否说详细点,谢谢

引用 1 楼 xunjingzhpu 的回复:
createfile 默认是有缓存的,ms修改最后一个参数就可以直接写而不使用缓存

writefile 之前不是有createfile吗,修改倒数第二个参……
点赞  2010-5-18 08:44
原来是这样:
在SPI驱动里的ThreadForTx线程中,有这么几句:
  1.         //Reset
  2.         pSPIregs->CH_CFG |= SW_RST;
  3.         //Sleep(5);                  //这难道就是每次调用WriteFile给SPI写数时有5ms延时的原因!  haiou
  4.         RETAILMSG(SPI_MSG,(TEXT("[SPI] HS SPI reset\n")));
  5.         pSPIregs->CH_CFG &= ~SW_RST;


我现在的做法是将Sleep(5)给删掉了,这样就解决了原来的延时问题,而且SPI数据传送的结果也是对的。
但总感觉这样做有些暴力,BSP是三星官方发布的,他这样做肯定有其中道理,CH_CFG中的SW_RST到底是什么作用啊?干嘛要在这里Sleep(5)啊?
点赞  2010-5-18 08:50
线程优先级调高,我就是碰到过很多此这样情况
点赞  2010-5-18 10:34
前辈,可否请问您,SPI驱动里面,比如您说的写48个Bytes,而SPI控制寄存器里面写数据的寄存器只有一个byte。我写了一次寄存器之后,怎么知道什么时候开始写下一次寄存器呢?可否将您的SPI驱动发给我参考一下,万分感谢。邮箱:kacyquan@gmail.com
点赞  2010-5-18 11:11
别叫我前辈,我刚入门;
驱动是开发板里带的,写多个bytes应该是通过扫描状态寄存器实现的;
给你的邮箱传了份,请查收;
要获得BSP要和三星的代理签保密协议,我传给SPI驱动应该不会被杀头吧,你不要再传别人了哦。

引用: 引用 9 楼 kacyquan 的回复:
前辈,可否请问您,SPI驱动里面,比如您说的写48个Bytes,而SPI控制寄存器里面写数据的寄存器只有一个byte。我写了一次寄存器之后,怎么知道什么时候开始写下一次寄存器呢?可否将您的SPI驱动发给我参考一下,万分感谢。邮箱:kacyquan@gmail.com
点赞  2010-5-19 15:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复