小弟奉命写一个无线芯片的驱动,主控芯片是三星的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口配置问题吗,小弟先行谢过。
快来人救命啊,如找出错误,小弟愿再送上一百分,急急急
我SPI上的SIMO,SOMI,SPICLK,NSS都没有接CC1100,也就是说2410是空载的
空载,还没试过,但按道理应该送出的波形,定夺无返回
我感觉空载的话应该也会产生波形的,不过现在没有波形的问题是不知道是哪里出的毛病,不知道是寄存器没配置对还是哪儿,我的寄存器配置是从网上查的资料,然后配置的,好几篇论文和贴子都是那样配置的,到了我这里就不好使了,郁闷,
值得一提的是现在我的SPPIN,就是那具管脚配置寄存器,在配置完之后(配置成了0x02,也是它的默认值),在读它的值的时候却是0,感觉应该是这儿的问题,但还是不太清楚应该改哪儿.
请高手告之一二
另外,是不是SPI的IO口应该禁止上拉啊,这是为什么呢,小弟电子实在是......
现在寄存器状态什么的都对了,可是还是没波形,是不是2410SPI不接从机设备就不会有波形呢
大家帮帮忙啊,急用,在线等
没问题了,原来是数据线没有焊好,虚连 ,多谢楼上几位的建议,谢谢
我的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出去的),我觉得很奇怪,但是我自己也找不到什么原因
请高手指教