我的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出去的),我觉得很奇怪,但是我自己也找不到什么原因
请高手指教
检查一下SDI的功能脚配置正确吗?如果都配置正确的话,至少读的时候时钟的波形应该是有的!
如果波形都看不到,那先查一下Read的函数被调用到没有
如果被调用到了再查为什么往Data寄存器上写数据没有写出来,是不是SPI别的寄存器配置有问题?
SPI没有几个寄存器可以配置的,应该很快就可搞定这问题的
LS正解呀
看不到波形的话,那就先确定驱动的Read函数是不是被系统调用了,
如果调用了的话,再确认相关的寄存器设置是否正确
问题是写成功了吗?单片机有收到数据,并做成回应吗?
是的,成功了的,2410做主机,单片机做从机,单片机能收到2410发的数据。
但是2410收不到单片机发的数据
如果确定ReadFile被调用了,而数据没有发送出去,那我觉得最大可能是SPI配置有问题
你可以做个试验,把Write里的代码放到Read里看能不能Write成功?
WriteFile能够发送数据,但是把SPI_Write的内容放到SPI_Read里面去,例如ReadFile一次,就发送一个0X01,这样发送是不成功的,发送不了数据,也看不到时钟波形。
我的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;
}
时钟是主设备产生的,从设备不会产生clock。 你要从单片机上读数据,必须向单片机端发一个dummy数据,来产生clock。Samsung规格书里有写。
是不是跟我上次一样,查到最后原来是SPI的读管脚有问题,最后更换了核心板就好了