win ce+2410 的SPI流驱动问题

fusensam3   2008-1-25 14:01 楼主
小弟奉命写一个无线芯片的驱动,主控芯片是三星的2410,操作系统是WIN CE5.0。无线芯片是CC1100,SPI接口的。所以理所当然的用2410的SPI口(设置为主机master方式)连接1100的SPI,来控制无线的收和发,我是用流驱动程序来操作2410的SPI的,初使化代码如下

void InitSPI(void)                        
{
               
         RETAILMSG (1, (TEXT("::: InitSPI\r\n") ));
          // Set I/O is SPI interface
          // Config GPE11,12,13 is SPIMOSI0,SPICLK0
          v_pIOPregs->rGPECON &= ~(0x3F << 22);
          v_pIOPregs->rGPECON |= (0x2A << 22);       
          // Config GPG3 is Master SPI CS                                    
          v_pIOPregs->rGPGCON &= ~(0x3 << 14);                          
          v_pIOPregs->rGPGCON |= (0x1 << 14);                //as out
          v_pIOPregs->rGPGUP &= ~(0x1 << 7);                //enable pullup for GPG7       
          // Initialize CS is high      
          v_pIOPregs->rGPGDAT |= (0x1 << 7);
          
       
    // Baudrate = PCLK/2/(Prescaler value + 1)
    // PCLK = 203000000/4 = 50750000 Hz
    // Prescaler value = 0x18 = 24
    // Baudrate = 50750000/2/(24 + 1) = 1015000 = 1.015MHz
    v_pSSPregs->rSPPRE0 = 0x18;       
   
    // Set SPCON0 to configure properly the SPI module.       
    // Master  
    // SCK enable
    // polling mode
    v_pSSPregs->rSPCON0 =0x18;        //001 1000
    // 0 Tx Auto Garbage Data mode enable (TAGD):Decide whether the receiving data only needs or not.
    //                                           0 = normal mode, 1 = Tx auto garbage data mode
    //                                           NOTE: In normal mode, if you only want to receive data,
    //                                           you should transmit dummy 0xFF data.
    // 1,2 It is possible to operate the devices in SPI modes 0,0and 1,1. (MCP41010 datasheet)
    //     Set SPI mode is 0,0.
    // 3 Set S3C2410 is Master.
    // 4 SCK Enable (ENSCK)
    // 5,6 Determine how and by what SPTDAT is read/written.
    //     00 = polling mode, 01 = interrupt mode
    //     10 = DMA mode, 11 = reserved
    //     Set polling mode
    v_pSSPregs->rSPPIN0=0x02;   //使用默认值
    RETAILMSG (1, (TEXT("::: InitSPI over\r\n") ));
}


流驱动接口的发送代码如下:



DWORD SPI_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{
  PUCHAR temp = (PUCHAR)pBuffer;

  // Set CS to low to activate MCP41010
  v_pIOPregs->rGPGDAT &= ~(0x1 << 7);
  

  // Check the status of Transfer Ready flag(READY=1) ,and then write data to SPTDAT0
  while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );
  v_pSSPregs->rSPTDAT0 = *temp; // Write Potentiometer value
  
  // Wait to complete write data
  while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );

  
  // Set CS to high to deactivate MCP41010
  v_pIOPregs->rGPGDAT |= (0x1 << 7);
  RETAILMSG(1,(TEXT("Dding: v_pSSPregs->rSPCON0 is 0x%x\n"),v_pSSPregs->rSPCON0));
  RETAILMSG(1,(TEXT("Dding: SPI_ Write return\n")));
        return 1;
}


我在应用程序中加了一个死循环,一直调用驱动写数据,以检测SPI的时钟信号(因为听说SPI如何没有数据流通的话时钟线是没有信号的),程序的执行也没问题,能够正确的调用SPI_Write(),在驱动程序的打印信息中也可以看到SPI_Write()被调用并且返回了,可是我用示波器在SPICLK管脚上并没有发现有波形,但是应用程序并可以写数据到SPI的数据移位寄存器中,不知道这种现象是什么原因造成的,请过来人指点一下。
还有一点需要说明,我SPI上的SIMO,SOMI,SPICLK,NSS都没有接CC1100,也就是说2410是空载的,这个是无波形的原因吗?

希望进来的各位释疑,看看是我的SPI口配置问题吗,小弟先行谢过。

回复评论 (10)

快来人救命啊,如找出错误,小弟愿再送上一百分,急急急
点赞  2008-1-27 12:57
我SPI上的SIMO,SOMI,SPICLK,NSS都没有接CC1100,也就是说2410是空载的
空载,还没试过,但按道理应该送出的波形,定夺无返回

点赞  2008-1-27 13:10
我感觉空载的话应该也会产生波形的,不过现在没有波形的问题是不知道是哪里出的毛病,不知道是寄存器没配置对还是哪儿,我的寄存器配置是从网上查的资料,然后配置的,好几篇论文和贴子都是那样配置的,到了我这里就不好使了,郁闷,
值得一提的是现在我的SPPIN,就是那具管脚配置寄存器,在配置完之后(配置成了0x02,也是它的默认值),在读它的值的时候却是0,感觉应该是这儿的问题,但还是不太清楚应该改哪儿.

请高手告之一二
点赞  2008-1-27 15:30
另外,是不是SPI的IO口应该禁止上拉啊,这是为什么呢,小弟电子实在是......
点赞  2008-1-27 16:11
现在寄存器状态什么的都对了,可是还是没波形,是不是2410SPI不接从机设备就不会有波形呢

大家帮帮忙啊,急用,在线等
点赞  2008-1-29 08:53
没问题了,原来是数据线没有焊好,虚连 ,多谢楼上几位的建议,谢谢
点赞  2008-2-19 12:44
呵呵,是楼上的一位,其它的那些位是俺自己.^_^
点赞  2008-2-19 12:45
空载可出波形
点赞  2008-2-19 12:47
我的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出去的),我觉得很奇怪,但是我自己也找不到什么原因

请高手指教
点赞  2008-12-25 18:01
学习下,呵呵
点赞  2009-4-12 10:16
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复