关于WINCE的SPI的流驱动的读数据的问题,很奇怪,我能发数据,但是读不了数据

cs5664798595   2008-12-27 21:22 楼主
我的SPI驱动程序里面的读写函数,并且我设置为POLLING模式和中断模式都试过
DWORD SPI_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{

PUCHAR readtemp=(PUCHAR)pBuffer;

while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );
v_pSSPregs->rSPTDAT0=0xff;  //发送0XFF数据,单片机接受到0XFF后,就发送消息;
while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );

        *readtemp=v_pSSPregs->rSPRDAT0; //此时接收到的数据,应该是上一个0XFF发给单片机后,单片机往它的SPI发送寄存器打入的数据
return 1;
}


DWORD SPI_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{

  PUCHAR writetemp = (PUCHAR)pBuffer;

  while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );
  v_pSSPregs->rSPTDAT0 = *writetemp;
  while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );

return 1;
}

以下为我在EVC的API函数,测试驱动的
hDrv=CreateFile(L"SPI1:",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);//打开API

char datavalue[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};  //写API,循环发送0--9
    int ret,datacount;
    ret=WriteFile(hDrv,datavalue+datacount,1,&dwWritten,NULL);
    datacount=datacount+1;
    if(datacount==10)
  {
datacount=0;
  }


char datavalue1;  读API
ReadFile(hDrv,&datavalue1,1,&dwread,NULL);


现在出现一个问题是:

我的ARM是2410,2410的SPI和一个单片机的SPI口连接
我现在遇到的问题是,将驱动程序烧进WINCE内核,然后用EVC写了个程序来运行,先打开API,然后写API函数时候,SPI能把数据发给单片机。但是读API函数就不行了,读不到任值。

写API的时候,在时钟线上用示波器可以看到时钟,但是读API的时候,在时钟线上用示波器看不到时钟(按道理说应该能看到的,应为我读API的时候,其实在驱动程序的SPI_Read函数里面,其实是先发送了一个0XFF出去的),我觉得很奇怪,但是我自己也找不到什么原因

请高手指教

回复评论 (17)

ding
点赞  2008-12-27 21:37
检查一下SDI的功能脚配置正确吗?如果都配置正确的话,至少读的时候时钟的波形应该是有的!
点赞  2008-12-27 23:05
如果波形都看不到,那先查一下Read的函数被调用到没有
如果被调用到了再查为什么往Data寄存器上写数据没有写出来,是不是SPI别的寄存器配置有问题?
SPI没有几个寄存器可以配置的,应该很快就可搞定这问题的
点赞  2008-12-27 23:16
LS正解呀

看不到波形的话,那就先确定驱动的Read函数是不是被系统调用了,
如果调用了的话,再确认相关的寄存器设置是否正确
点赞  2008-12-28 00:38
记得正确配置SPI的工作模式
点赞  2008-12-28 08:40
三星的SPI驱动调试想想都怕。我曾经折腾了一个月
点赞  2008-12-28 10:29
mark
点赞  2008-12-31 15:42
问题是写成功了吗?单片机有收到数据,并做成回应吗?
点赞  2008-12-31 16:22
是的,成功了的,2410做主机,单片机做从机,单片机能收到2410发的数据。
但是2410收不到单片机发的数据
点赞  2009-1-4 10:34
用示波器量量看,单片机有没发出来!
点赞  2009-1-4 13:12
如果确定ReadFile被调用了,而数据没有发送出去,那我觉得最大可能是SPI配置有问题
你可以做个试验,把Write里的代码放到Read里看能不能Write成功?
点赞  2009-1-4 13:15
mark
点赞  2009-1-4 13:33
WriteFile能够发送数据,但是把SPI_Write的内容放到SPI_Read里面去,例如ReadFile一次,就发送一个0X01,这样发送是不成功的,发送不了数据,也看不到时钟波形。
点赞  2009-1-4 19:14
我的SPI的设置如下
SPI_Init(DWORD dwContext)
{
   unsigned int pclk = S2410PCLK;
   v_pIOPregs->rGPECON &= 0xfabfffff;
   v_pIOPregs->rGPECON |= 0xa800000;
   v_pIOPregs->rGPEUP|=0x3800;
   v_pSSPregs->rSPPRE0 = 10;
   v_pSSPregs->rSPCON0 = 0x3a
   v_pSSPregs->rSPPIN0=0x02;
}
点赞  2009-1-4 19:19
时钟是主设备产生的,从设备不会产生clock。 你要从单片机上读数据,必须向单片机端发一个dummy数据,来产生clock。Samsung规格书里有写。
点赞  2009-2-24 17:26

是不是跟我上次一样,查到最后原来是SPI的读管脚有问题,最后更换了核心板就好了
点赞  2009-2-24 17:47

18楼 XY 

我用的是s3c2440 ,还没入门呢
点赞  2009-4-16 13:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复