⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpio_i2c.c

📁 在Wince环境下面的用 gpio 来模拟 i2c的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:

/***************************************************

WRITE CONTROL DATA: make sure here: SLCK = 0; SDIO = 0

****************************************************/

    if(operation == READ)

    {
        RETAILMSG(1,(TEXT("0x49 READ!\r\n ")));
        controlword = 0x4A;
        
    }
    else 
    {
        RETAILMSG(1,(TEXT("0x48 WRITE!\r\n ")));
        controlword = 0x4B;
        
    }
    RETAILMSG(3,(TEXT("Write IIC ADDR:  0x%x\r\n"),controlword));
    for(i = 7; i>=0; i--)
    {
        if((controlword >> i) & 0x01)
            
            sdio_high();

        else

            sdio_low();
    
            sleepGPIO(500);
        
            sclk_high();
        
            sleepGPIO(500);
        
            sclk_low();
        
            sleepGPIO(500);
    }

    
/***************************

CHECK ACK for control word

***************************/

     sdio_input_enable();
    
     sleepGPIO(500);

     sclk_high();

     sleepGPIO(500);
    if(( returndata = sdio_getdata())!= 0)//READ_SDIO
    {

        error = 1;
        
        RETAILMSG(1,(TEXT("Write add ack error!\r\n ")));
        
        RETAILMSG(3,(TEXT("returndata:  %d\r\n"),returndata));
          
        goto STOP;

    }
    RETAILMSG(1,(TEXT("Write add ack OK!\r\n ")));

    sclk_low();

    sleepGPIO(500);
/***************************************

WRITE or READ data

****************************************/
if(operation == READ)
            RETAILMSG(3,(TEXT("read data show:  ")));
    else
        RETAILMSG(3,(TEXT("write data show:  ")));
    

    for(j = 0; j < numBytes; j++, data++)
    {
        if(operation == WRITE)

            sdio_output_enable();
        else

            sdio_input_enable();

        for(i = 7; i>=0; i--)

        {
            if(operation == WRITE)

                if((*data >> i) & 0x01)

                    sdio_high();
                else

                    sdio_low();

                    sleepGPIO(50);

                    sclk_high();

                    sleepGPIO(50);

              if(operation == READ)

                *data = ((*data << 1) | (sdio_getdata()));//READ_SDIO

              sclk_low();

              sleepGPIO(50);

        }
        
            if(operation == READ)

            RETAILMSG(3,(TEXT("  0x%x"),*data));

        else

            RETAILMSG(3,(TEXT("  0x%x"),*data));

        //modify at 20080331

/******************************

CHECK ACK or SEND ACK=0

*******************************/

        if(operation == WRITE)

            sdio_input_enable();
        else
        {

            sdio_output_enable();

            if(j == (numBytes - 1))

                sdio_high();
            else

                sdio_high();
        }

        sleepGPIO(50);

        sclk_high();

        sleepGPIO(50);

        if(operation == WRITE)
            if((sdio_getdata())!= 0)//READ_SDIO
            {
                 RETAILMSG(1,(TEXT("  ACK ERROR,Quit!\r\n")));
                error = 1;
                goto STOP;
            }
            RETAILMSG(1,(TEXT("  ACK OK")));

            sclk_low();

            sleepGPIO(50);
        }
    

/****************************

STOP: make sure here: SCLK = 0

*****************************/

    STOP:


    sdio_output_enable();

    sdio_low();

    sleepGPIO(50);

    sclk_high();

    sleepGPIO(50);

    sdio_high();

    return(error);

//function end

}


///////////////////////////////////////////////////////////////////////////////

//------------------------------------------------------------------------------
// @xref                          <nl>
//          <f DEMO_Init>,         <nl>
//          <f DEMO_Deinit>,       <nl>
//          <f DEMO_Open>,         <nl>
//          <f DEMO_Close>,        <nl>
//          <f DEMO_Read>,         <nl>
//          <f DEMO_Write>,        <nl>
//          <f DEMO_Seek>,         <nl>
//          <f DEMO_PowerUp>,      <nl>
//          <f DEMO_PowerDown>,    <nl>
//          <f DEMO_IOControl>     <nl>
//
// -----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////
BOOL CALLBACK DllMain(HANDLE hDLL,
                      DWORD dwReason,
                      LPVOID lpvReserved)
{
    switch (dwReason) 
    {
    case DLL_PROCESS_ATTACH :

        DEBUGREGISTER((HINSTANCE)hDLL);

        DisableThreadLibraryCalls((HMODULE) hDLL);

        break;

    case DLL_PROCESS_DETACH :

        break;

    case DLL_THREAD_DETACH :

        break;

    case DLL_THREAD_ATTACH :

        break;

    default :

        break;
    }
    //end switch

    return TRUE;
}

extern "C" DWORD DEMO_Init(DWORD Index)
{
    RETAILMSG(1,(TEXT("DEMO_Init!\r\n ")));

       //DEMO_reset();
   
       // initial_DEMO();
       
    return TRUE;
}

// -----------------------------------------------------------------------------
//
//  @doc    WDEV_EXT
//
//  @func   PVOID | DEMO_Deinit | Device deinitialization routine
//
//  @parm   DWORD | dwData | value returned from DEMO_Init call
//
//  @rdesc  Returns TRUE for success, FALSE for failure.
//
// -----------------------------------------------------------------------------
extern "C" BOOL DEMO_Deinit(DWORD dwData)
{
    RETAILMSG(1,(TEXT("DEMO_DeInit!\r\n ")));
    return TRUE;
}

// -----------------------------------------------------------------------------
//
//  @doc    WDEV_EXT
//
//  @func   PVOID | DEMO_Open    | Device open routine
//
//  @parm   DWORD | dwData      | Value returned from DEMO_Init call (ignored)
//
//  @parm   DWORD | dwAccess    | Requested access (combination of GENERIC_READ
//                                and GENERIC_WRITE) (ignored)
//
//  @parm   DWORD | dwShareMode | Requested share mode (combination of
//                                FILE_SHARE_READ and FILE_SHARE_WRITE) (ignored)
//
//  @rdesc  Returns a DWORD which will be passed to Read, Write, etc or NULL if
//          unable to open device.
//
// -----------------------------------------------------------------------------
extern "C" PDWORD DEMO_Open( DWORD dwData,
                           DWORD dwAccess,
                           DWORD dwShareMode)
{
    RETAILMSG(1,(TEXT("DEMO_OPEN \r\ndwData=%d;AccessCode=%d \r\n"),dwData, dwAccess));

     initial_DEMO();

    

    return (PDWORD)TRUE;

    //modify by mercury xu Mercury's 2008-04-04
}

// -----------------------------------------------------------------------------
//
//  @doc    WDEV_EXT
//
//  @func   BOOL | DEMO_Close | Device close routine
//
//  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call
//
//  @rdesc  Returns TRUE for success, FALSE for failure
//
// -----------------------------------------------------------------------------
extern "C" BOOL DEMO_Close(PDWORD pdwData)
{

    return(FALSE);
}

// -----------------------------------------------------------------------------
//
//  @doc    WDEV_EXT
//
//  @func   DWORD | DEMO_Read | Device read routine
//
//  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
//
//  @parm   LPVOID | pBuf | Buffer to receive data (ignored)
//
//  @parm   DWORD | len | Maximum length to read (ignored)
//
//  @rdesc  Returns 0 always. DEMO_Read should never get called and does
//          nothing. Required DEVICE.EXE function, but all data communication
//          is handled by <f DEMO_IOControl>.
//
// -----------------------------------------------------------------------------
extern "C" DWORD DEMO_Read(DWORD dwData,
                          LPVOID pBuf,
                          DWORD Len)
{


    return  (FALSE);
    
}

// -----------------------------------------------------------------------------
//
//  @doc    WDEV_EXT
//
//  @func   DWORD | DEMO_Write | Device write routine
//
//  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
//
//  @parm   LPCVOID | pBuf | Buffer containing data (ignored)
//
//  @parm   DWORD | len | Maximum length to write (ignored)
//
//  @rdesc  Returns 0 always. DEMO_Write should never get called and does
//          nothing. Required DEVICE.EXE function, but all data communication
//          is handled by <f DEMO_IOControl>.
//
// -----------------------------------------------------------------------------
extern "C" DWORD DEMO_Write(DWORD dwData,
                           LPCVOID pBuf,
                           DWORD Len)
{      
    unsigned short temp;
    temp = *(unsigned short *) pBuf;

    RETAILMSG(1,(TEXT("DEMO_write!\r\n ")));
    return(TRUE);
    
}

// -----------------------------------------------------------------------------
//
//  @doc    WDEV_EXT
//
//  @func   DWORD | DEMO_Seek | Device seek routine
//
//  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
//
//  @parm   long | pos | Position to seek to (relative to type) (ignored)
//
//  @parm   DWORD | type | FILE_BEGIN, FILE_CURRENT, or FILE_END (ignored)
//
//  @rdesc  Returns -1 always. DEMO_Seek should never get called and does
//          nothing. Required DEVICE.EXE function, but all data communication
//          is handled by <f DEMO_IOControl>.
//
// -----------------------------------------------------------------------------
extern "C" DWORD DEMO_Seek(DWORD dwData,
                          long pos,
                          DWORD type)
{


    RETAILMSG(1,(TEXT("DEMO_Seek!\r\n ")));
    return(TRUE);
    //return((DWORD)DEMO_FM_Tune_DEMO());
}

// -----------------------------------------------------------------------------
//
//  @doc    WDEV_EXT
//
//  @func   void | DEMO_PowerUp | Device powerup routine
//
//  @comm   Called to restore device from suspend mode.  Cannot call any
//          routines aside from those in the dll in this call.
//
// -----------------------------------------------------------------------------
extern "C" VOID DEMO_PowerUp(VOID)
{


    //DEMO_reset();
    RETAILMSG(1,(TEXT("DEMO_PowerUp!\r\n ")));
//  sleepGPIO(800);

}

// -----------------------------------------------------------------------------
//
//  @doc    WDEV_EXT
//
//  @func   void | DEMO_PowerDown | Device powerdown routine
//
//  @comm   Called to suspend device.  Cannot call any routines aside from
//          those in the dll in this call.
//
// -----------------------------------------------------------------------------
extern "C" VOID DEMO_PowerDown(VOID)
{
    RETAILMSG(1,(TEXT("DEMO_PowerDown!\r\n ")));
}



// -----------------------------------------------------------------------------
//
//  @doc    WDEV_EXT
//
//  @func   BOOL | DEMO_IOControl | Device IO control routine
//
//  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call
//
//  @parm   DWORD | dwCode |
//          IO control code for the function to be performed. DEMO_IOControl only
//          supports one IOCTL value (IOCTL_DEMO_MESSAGE)
//
//  @parm   PBYTE | pBufIn |
//          Pointer to the input parameter structure (<t MMDRV_MESSAGE_PARAMS>).
//
//  @parm   DWORD | dwLenIn |
//          Size in bytes of input parameter structure (sizeof(<t MMDRV_MESSAGE_PARAMS>)).
//
//  @parm   PBYTE | pBufOut | Pointer to the return value (DWORD).
//
//  @parm   DWORD | dwLenOut | Size of the return value variable (sizeof(DWORD)).
//
//  @parm   PDWORD | pdwActualOut | Unused
//
//  @rdesc  Returns TRUE for success, FALSE for failure
//
//  @xref   <t DEMOe Input Driver Messages> (WIDM_XXX) <nl>
//          <t DEMOe Output Driver Messages> (WODM_XXX)
//
// -----------------------------------------------------------------------------
extern "C"  BOOL DEMO_IOControl(PDWORD  pdwOpenData,
                               DWORD  dwCode,
                               PBYTE  pBufIn,
                               DWORD  dwLenIn,
                               PBYTE  pBufOut,
                               DWORD  dwLenOut,
                               PDWORD pdwActualOut)
{

    RETAILMSG(1,(TEXT("DEMO\r\n  pdwOpenData=%d;dwCode=%d\r\n"),pdwOpenData,dwCode));
    
    return(FALSE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -