天嵌 ARM开发社区

 找回密码
 注册
查看: 4254|回复: 7

DeviceIoControl里的写入值传到SPI_Iocontrol 错误

[复制链接]
415934229 发表于 2012-11-1 16:24:28 | 显示全部楼层 |阅读模式
为什么我在应用程序里配置
spiSetConfig.dwTimeOutVal = 3000;
SetConfig.dwMode = 1;
SetConfig.dwPrescaler = 2;
SetConfig.bUseRxDMA = FALSE;
SetConfig.bUseRxIntr = FALSE;
SetConfig.bUseTxDMA = FALSE;
SetConfig.bUseTxIntr = FALSE;
然后调用DeviceIoControl函数,而在驱动中SPI_Iocontol打印以上几个数值都不正确,全都是164954130

DeviceIoControl里的写入值都传不到SPI_Iocontrol 中,用的是6410的天嵌spi驱动。没改驱动。

SPI_Iocontrol()代码如下:

switch(dwIoControlCode)
    {
    case SPI_IOCTL_SET_CONFIG:
                                                                RETAILMSG(1,(TEXT("SPI_IOControl;switch  SPI_IOCTL_SET_CONFIG \r\n")));
        __try
        {
            if( lpInBuf == NULL || nInBufSize != sizeof(SET_CONFIG) )
            {
                bResult = FALSE;
                                                                 RETAILMSG(1,(TEXT("lpInBuf == NULL || nInBufSize != sizeof(SET_CONFIG)\n")));
                break;
            }
                                                                RETAILMSG(1,(TEXT("lpInBuf == NULL || nInBufSize != sizeof(SET_CONFIG)  successed \n")));
            if (!CeSafeCopyMemory((LPVOID)&SetConfig, lpInBuf, nInBufSize))
            {
                bResult = FALSE;
                                                                RETAILMSG(1,(TEXT("CeSafeCopyMemory bResult = FALSE\n")));
                break;
            }
            pSpiPrivate->dwTimeOutVal       =SetConfig.dwTimeOutVal;
                                                                RETAILMSG(SPI_ERR,(TEXT("SPI_IOCTL_SET_CONFIG  dwTimeOutVal = : %d\n ",pSpiPrivate->dwTimeOutVal)));
            pSpiPrivate->dwMode             =SetConfig.dwMode;
                                                                RETAILMSG(SPI_ERR,(TEXT("SPI_IOCTL_SET_CONFIG  dwMode = : %d\n ",pSpiPrivate->dwMode)));
            pSpiPrivate->dwPrescaler        =SetConfig.dwPrescaler;
                                                                RETAILMSG(SPI_ERR,(TEXT("SPI_IOCTL_SET_CONFIG  dwPrescaler = : %d\n ",pSpiPrivate->dwPrescaler)));
               
            pSpiPrivate->bUseRxDMA          =SetConfig.bUseRxDMA;
                                                                RETAILMSG(SPI_ERR,(TEXT("SPI_IOCTL_SET_CONFIG  bUseRxDMA = : %d\n ",pSpiPrivate->bUseRxDMA)));
            pSpiPrivate->bUseRxIntr         =SetConfig.bUseRxIntr;
                                                                RETAILMSG(SPI_ERR,(TEXT("SPI_IOCTL_SET_CONFIG  bUseRxIntr = : %d\n ",pSpiPrivate->bUseRxIntr)));
            pSpiPrivate->bUseTxDMA          =SetConfig.bUseTxDMA;
RETAILMSG(SPI_ERR,(TEXT("SPI_IOCTL_SET_CONFIG  bUseTxDMA = : %d\n ",pSpiPrivate->bUseTxDMA)));
            pSpiPrivate->bUseTxIntr         =SetConfig.bUseTxIntr;
                                                        RETAILMSG(SPI_ERR,(TEXT("SPI_IOCTL_SET_CONFIG  bUseTxIntr = : %d\n ",pSpiPrivate->bUseTxIntr)));
embedsky_lhh 发表于 2012-11-1 16:34:41 | 显示全部楼层
用%x输出试试,还有你可以贴下应用中是怎么传的是传Inbuf?最好贴下代码
 楼主| 415934229 发表于 2012-11-1 16:40:35 | 显示全部楼层
embedsky_lhh 发表于 2012-11-1 16:34
用%x输出试试,还有你可以贴下应用中是怎么传的是传Inbuf?最好贴下代码

typedef struct {
        DWORD                   dwMode;

        BOOL                    bUseFullDuflex;

        DWORD                   dwRxBurstDataLen;
        BOOL                    bUseRxDMA;
        BOOL                    bUseRxIntr;

        DWORD                   dwTxBurstDataLen;
        BOOL                    bUseTxDMA;
        BOOL                    bUseTxIntr;

        DWORD                   dwPrescaler;
        DWORD                   dwTimeOutVal;
} SET_CONFIG, *PSET_CONFIG;
hSensor= CreateFile(TEXT("SPI1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,0);
Result=DeviceIoControl(hSensor,1769472, &Set_SPI_config,sizeof(Set_SPI_config),NULL,0,NULL,NULL); // SPI_IOCTL_SET_CONFIG is : 1769472       

SET_CONFIG Set_SPI_config;
        //Set_SPI_config.bUseFullDuflex=FALSE;
        Set_SPI_config.bUseRxDMA=FALSE;
        Set_SPI_config.bUseRxIntr=FALSE;
        Set_SPI_config.bUseTxDMA=FALSE;
        Set_SPI_config.dwMode=1;
        Set_SPI_config.dwPrescaler=2;
        //Set_SPI_config.dwRxBurstDataLen=16;
        Set_SPI_config.dwTimeOutVal=3000;
        //Set_SPI_config.dwTxBurstDataLen=16;
 楼主| 415934229 发表于 2012-11-1 16:41:24 | 显示全部楼层
415934229 发表于 2012-11-1 16:40
typedef struct {
        DWORD                   dwMode;

先配置的 ,在createfile 和deviceiocontrol的
 楼主| 415934229 发表于 2012-11-1 16:52:26 | 显示全部楼层

SPI_IoContronl() 变量赋值问题

这是我在SPI_IoControl()里加的调试信息: 看下面
case SPI_IOCTL_SET_CONFIG:  
RETAILMSG(1,(TEXT("SPI_IOControl;switch  SPI_IOCTL_SET_CONFIG \r\n")));
__try
    {
if( lpInBuf == NULL || nInBufSize != sizeof(SET_CONFIG) )
    {
bResult = FALSE;
RETAILMSG(1,(TEXT("lpInBuf == NULL || nInBufSize != sizeof(SET_CONFIG)\n")));
break;
}
RETAILMSG(1,(TEXT("lpInBuf == NULL || nInBufSize != sizeof(SET_CONFIG)  successed \n")));
if (!CeSafeCopyMemory((LPVOID)&SetConfig, lpInBuf, nInBufSize))
{
bResult = FALSE;
RETAILMSG(1,(TEXT("CeSafeCopyMemory bResult = FALSE\n")));
break;
}
这里:
SetConfig.dwTimeOutVal = 3000;
SetConfig.dwMode = 1;
SetConfig.dwPrescaler = 2;
SetConfig.bUseRxDMA = FALSE;
SetConfig.bUseRxIntr = FALSE;
SetConfig.bUseTxDMA = FALSE;
SetConfig.bUseTxIntr = FALSE;
RETAILMSG(SPI_ERR,(TEXT("dwTimeOutVal=%; dwMode=%d; dwPrescaler=%d; bUseRxDMA=%d; bUseRxIntr=%d; bUseTxDMA=%d; bUseTxIntr=%d;",SetConfig.dwTimeOutVal,SetConfig.dwMode,SetConfig.dwPrescaler,SetConfig.bUseRxDMA,SetConfig.bUseRxIntr,SetConfig.bUseTxDMA,SetConfig.bUseTxIntr)));

打印出来的 信息是
dwTimeOutVal=1765080; dwMode=0; dwPrescaler=0; bUseRxDMA=1; bUseRxIntr=0; bUseTxDMA=1; bUseTxIntr=0
很不解 ,请解释一下.
亚瑟王 发表于 2012-11-1 17:23:49 | 显示全部楼层
415934229 发表于 2012-11-1 16:41
先配置的 ,在createfile 和deviceiocontrol的

这个驱动是三星原版BSP包的驱动,我们用的重力传感器的SPI驱动都是自己编写的,没有用BSP包自带的。怀疑这个驱动初始化SPI控制器的时候已经出错了。
 楼主| 415934229 发表于 2012-11-1 17:25:47 | 显示全部楼层
亚瑟王 发表于 2012-11-1 17:23
这个驱动是三星原版BSP包的驱动,我们用的重力传感器的SPI驱动都是自己编写的,没有用BSP包自带的。怀疑这 ...

我汗,那光盘里有没有你们的驱动啊。
亚瑟王 发表于 2012-11-5 09:21:44 | 显示全部楼层
415934229 发表于 2012-11-1 17:25
我汗,那光盘里有没有你们的驱动啊。

加速度传感器的驱动是没有开源的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-20 15:47 , Processed in 1.031250 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表