在S3C6410,win CE 6.0下面写了个外挂AD的驱动,用流式驱动架构写的,AD与CPU的接口为SPI接口,因此在流式驱动中调用了SPI的驱动,代码如下:
extern "C"
DWORD ADD_Init()
{
DWORD dwErr,ret;
U8 temp;
RETAILMSG(1, (TEXT("LMP90080 Init--\r\n")));
hSPI = CreateFile( L"SPI0:",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, 0);
if ( INVALID_HANDLE_VALUE == hSPI )
{
dwErr = GetLastError();
RETAILMSG(1, (TEXT("Error %d opening device '%s' \r\n"), dwErr, L"SPI0:" ));
}
config.dwMode = 1;
config.bUseFullDuflex = TRUE;
config.bUseRxDMA = TRUE;
config.bUseRxIntr = FALSE;
config.bUseTxDMA = TRUE;
config.bUseTxIntr = FALSE;
config.dwPrescaler = 5;
config.dwTxBurstDataLen = 16;
config.dwRxBurstDataLen = 16;
config.dwTimeOutVal = 10;
ret = DeviceIoControl(hSPI,SPI_IOCTL_SET_CONFIG,&config,sizeof(config),NULL,0,NULL,NULL);
if (ret == false)
RETAILMSG(1, (TEXT("SPI_IOCTL_SET_CONFIG failed!\r\n")));
ret = DeviceIoControl(hSPI,SPI_IOCTL_START,NULL,0,NULL,0,NULL,NULL);
if (ret == false)
dwErr = GetLastError();
RETAILMSG(1,(TEXT("SPI_IOCTL_START failed! Error code:%d\r\n"),dwErr));
WriteBToAddr(0x12,0x20);//选择内部时钟
//temp=ReadBFromAddr(0x12);
//WriteBToAddr(0x01,0x08);//路由DRDYB到D6
// WriteBToAddr(0x0e,0x03);//设置d0 d1 为输出
// WriteBToAddr(0x0f,0x03);//设置GPIO全部输出高电平,继电器常开不闭合
WriteBToAddr(0x10,0x02);//后台校准控制,BGCALCN=0x2
//WriteBToAddr(0x11,0x83);//路由DRDYB到D6
WriteBToAddr(0x21,0x71);//CH0,GAIN_SEL=0x0,BUF_EN=1
WriteBToAddr(0x20,0x07);//初始化通道0--v1 VINN=VIN7,VINP=VIN0,VREF_SEL=0
WriteBToAddr(0x1f,0x0);//初始化通道0
Delay(2);
temp=(ReadBFromAddr(0x1e)&0xFF);
while(0xff==temp);
result=ReadBFromAddr(0x1b)&0xFFFF;
RETAILMSG(1,(TEXT("LMP90080 Conversion result is:%lu\r\n"),result));
//WriteBToAddr(0x21,0x70);//配置通道特性
//WriteBToAddr(0x22,0x0f);//初始化通道1--v2
//WriteBToAddr(0x23,0x70);//数据率214.65 增益1
//WriteBToAddr(0x24,0x17);//初始化通道2--vot
//WriteBToAddr(0x25,0x70);//使用缓冲
return TRUE;
}
现在的问题是执行第一条DeviceIocontrol语句是成功的,而执行到第二条DeviceIocontrol语句时就会出现错误,串口信息如下:
SPI_IOControl: CeOpenCallerBuffer failed for input buffer.
SPI_IOCTL_START failed! Error code:31
我把第一条DeviceIOcontrol语句注释掉之后,问题依旧。请做过的朋友帮忙分析下原因。。。