4814|11

84

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

写了个2440下的wince SPI驱动,请高手看下有什么问题 [复制链接]


#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
#include
#include
#include
#include "s2440.h"
//#include "SPI.h"
HANDLE g_hInstance;
volatile IOPreg * v_pIOPregs;
volatile CLKPWRreg * v_pclkpwrregs;
volatile SSPreg *v_pSSPregs;

BOOL SPI_InitAddrIO(void);
BOOL SPI_InitAddrSPI(void);
BOOL SPI_InitAddrPwr(void);
void SPI_SendData(unsigned char);
/*******************************************************************************************
函数名称: DllEntry
描    述: 驱动程序动态库入口
输入参数:        
输出参数:
返    回:
*******************************************************************************************/
BOOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
    switch ( dwReason )
        {
                case DLL_PROCESS_ATTACH:
                        RETAILMSG(1, (TEXT("SPI: DLL_PROCESS_ATTACH.\r\n")));        /* 提示动态库加载 */
                        DisableThreadLibraryCalls((HMODULE) hInstDll);                       
                        break;

                case DLL_PROCESS_DETACH:
                        RETAILMSG(1, (TEXT("SPI: DLL_PROCESS_DETACH.\r\n")));        /* 提示动态库卸载 */
                        break;
    }
   
    return (TRUE);
}
void InitSPI(void) //init uart2
{
        unsigned int pclk = S2440PCLK;  
        RETAILMSG (1, (TEXT("SPI_Initialize \r\n") ));
         /* enable pclk for spiclk */
          v_pclkpwrregs->rCLKCON |= (1<<18);
//spi1 init
/*   
        v_pIOPregs->rGPGCON &= ~(0x3F << 10);
        v_pIOPregs->rGPGCON |= (0x3F << 10);
        v_pIOPregs->rGPGUP  |=(0X7<<5);
               
       v_pSSPregs->rSPPRE1 = 0x18;       
       v_pSSPregs->rSPCON1 = 0x1e;
       v_pSSPregs->rSPPIN1 = 0x02;
*/
//spi0 init             
             v_pIOPregs->rGPECON &= ~(0x3F << 22);
        v_pIOPregs->rGPECON |= (0x2A << 22);
        v_pIOPregs->rGPEUP  |=(0X7<<11);
       
       v_pSSPregs->rSPPRE0 = 0x18;       
       v_pSSPregs->rSPCON0 = 0x1e;
       v_pSSPregs->rSPPIN0 = 0x02;   
     RETAILMSG (1, (TEXT("SPI_Initialize OK\r\n") ));
}
BOOL
SPI_InitAddrIO(void)
{
                BOOL        RetValue = TRUE;
               
                v_pIOPregs = (volatile IOPreg *)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);


                if (v_pIOPregs == NULL)
                {
                               
                        ERRORMSG(1,(TEXT("For SPI_IOPregs : VirtualAlloc failed!\r\n")));
                        RetValue = FALSE;
                }
                else
                {
                        if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(IOP_BASE), sizeof(IOPreg), PAGE_READWRITE | PAGE_NOCACHE))
                        {
                                ERRORMSG(1,(TEXT("For SPI_IOPregs: VirtualCopy failed!\r\n")));
                                RetValue = FALSE;
                        }
                }
       
                if (!RetValue)
                {
                        RETAILMSG (1, (TEXT("::: SPI_InitializeAddresses - Fail!!\r\n") ));
                        if (v_pIOPregs)
                        {
                                VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
                        }
                        v_pIOPregs = NULL;
                }
                else
                {
                        ;
                        RETAILMSG (1, (TEXT("::: SPI_InitializeAddresses - Success\r\n") ));
                }

                return(RetValue);
}

BOOL
SPI_InitPwr(void)
{
                BOOL        RetValue = TRUE;
        v_pclkpwrregs = (volatile CLKPWRreg *)VirtualAlloc(0, sizeof(CLKPWRreg), MEM_RESERVE, PAGE_NOACCESS);
                if (v_pclkpwrregs == NULL)
                {       
                        ERRORMSG(1,(TEXT("For SPI_Pwr : VirtualAlloc failed!\r\n")));
                        RetValue = FALSE;
                }
                else
                {
                        if (!VirtualCopy((PVOID)v_pclkpwrregs, (PVOID)(IOP_BASE), sizeof(CLKPWRreg), PAGE_READWRITE | PAGE_NOCACHE))
                        {
                                ERRORMSG(1,(TEXT("For SPI_Pwr: VirtualCopy failed!\r\n")));
                                RetValue = FALSE;
                        }
                }
       
                if (!RetValue)
                {
                        RETAILMSG (1, (TEXT("::: SPI_Pwr - Fail!!\r\n") ));
                        if (v_pIOPregs)
                        {
                                VirtualFree((PVOID)v_pclkpwrregs, 0, MEM_RELEASE);
                        }
                        v_pIOPregs = NULL;
                }
                else
                {
                        RETAILMSG (1, (TEXT("::: SPI_Pwr - Success\r\n") ));
                }

                return(RetValue);
}
BOOL
SPI_InitAddrSPI(void)
{
                BOOL        RetValue = TRUE;

                v_pSSPregs = (volatile SSPreg *)VirtualAlloc(0, sizeof(UART2reg), MEM_RESERVE, PAGE_NOACCESS);
                if (v_pSSPregs == NULL)
                {
                        ERRORMSG(1,(TEXT("For SPI_UART2regs : VirtualAlloc failed!\r\n")));
                        RetValue = FALSE;
                }
                else
                {
                        if (!VirtualCopy((PVOID)v_pSSPregs, (PVOID)(UART2_BASE), sizeof(UART2reg), PAGE_READWRITE | PAGE_NOCACHE))
                        {
                                ERRORMSG(1,(TEXT("For SPI_UART2regs: VirtualCopy failed!\r\n")));
                                RetValue = FALSE;
                        }
                }
       
                if (!RetValue)
                {
                        RETAILMSG (1, (TEXT("::: SPI_InitializeAddresses - Fail!!\r\n") ));
                        if (v_pSSPregs)
                        {
                                VirtualFree((PVOID) v_pSSPregs, 0, MEM_RELEASE);
                        }
                        v_pSSPregs = NULL;
                }
                else
                {
                        ;
                        RETAILMSG (1, (TEXT("SPI_InitializeAddresses - Success\r\n") ));
                }
                return(RetValue);
}
DWORD
SPI_Init(DWORD dwContext)
{
        RETAILMSG(1,(TEXT("SPI: SPI_ INIT\n")));
  SPI_InitAddrIO();
  SPI_InitAddrSPI();
  SPI_InitPwr();
        InitSPI();

        return 1;
}

DWORD
SPI_Close(DWORD Handle)
{
    return TRUE;
}   

DWORD SPI_Deinit(
    DWORD dwContext     // future: pointer to the per disk structure
    )
{
    return TRUE;
}   
DWORD SPI_Open(
    DWORD dwData,
    DWORD dwAccess,
    DWORD dwShareMode
    )
{
    return 1;
}   


DWORD SPI_IOControl(
    DWORD Handle,
    DWORD dwIoControlCode,
    PBYTE pInBuf,
    DWORD nInBufSize,
    PBYTE pOutBuf,
    DWORD nOutBufSize,
    PDWORD pBytesReturned
    )
{
return 1;
}   
DWORD SPI_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
    RETAILMSG (1, (TEXT("SPI_Read---ing\r\n") ));
   return 0;
}

DWORD SPI_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{
        PUCHAR temp = (PUCHAR) pBuffer;
        while(1)   
            {                     
                            if(v_pSSPregs->rSPSTA0 && 0x01)      
                      {      
                              v_pSSPregs->rSPTDAT0 = *temp;
                              RETAILMSG (1, (TEXT("write \r\n") ));
                              RETAILMSG (1, (TEXT("pBuffer=%d \r\n"),*temp ));
                            
                              return 1;      
                             }                                            
            }               
        return 1;
}
DWORD SPI_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
        return 0;
}

void SPI_PowerUp(void)
{
        return;
}

void SPI_PowerDown(void)
{
        return;
}

最新回复

楼主你所说的虚拟地址搞错能给我发个E-MAIL说说吗我也有你这个现象我的邮箱是wild_caojian@163.com  详情 回复 发表于 2010-4-20 16:26
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
主要实现了一个写的函数,两个主要函数已经用红色标出。
用示波器看不到波形,连clk上都没有,请大家帮忙看下是什么地方出问题了。
谢谢了。
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你只把驱动写了,没有进行调用
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
仔细看看register的设置,应该是没设置好。
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

5
 
对啊,不调用,怎么可能有波形。如果没有SPI从设备,可以只写不读!
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
谢谢各位的回答,已经找到问题了,是虚拟地址映射有问题。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
闂佸搫琚崕鍐诧耿閸涙潙瀚夋い鎺嗗亾缂佹锕㈠畷妤呭Ω閳轰礁濮ら柣鐘遍檷閸斿繘顢欓幋锔芥櫖鐎光偓閸愭儳娈�闂佽皫鍡╁殭缂傚稄鎷�闂佺懓鐡ㄩ悧鐐哄焵椤掑﹥瀚�濠电偛顦崝宀勫船閿燂拷
 
 
 

回复

62

帖子

2

TA的资源

一粒金砂(中级)

8
 
闂佸搫琚崕鍐诧耿閸涙潙瀚夋い鎺嗗亾缂佹锕㈠畷妤呭Ω閳轰礁濮ら柣鐘遍檷閸斿繘顢欓幋锔芥櫖鐎光偓閸愭儳娈�闂佽皫鍡╁殭缂傚稄鎷�闂佺懓鐡ㄩ悧鐐哄焵椤掑﹥瀚�濠电偛顦崝宀勫船閿燂拷
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

9
 
闂佸搫琚崕鍐诧耿閸涙潙瀚夋い鎺嗗亾缂佹锕㈠畷妤呭Ω閳轰礁濮ら柣鐘遍檷閸斿繘顢欓幋锔芥櫖鐎光偓閸愭儳娈�闂佽皫鍡╁殭缂傚稄鎷�闂佺懓鐡ㄩ悧鐐哄焵椤掑﹥瀚�濠电偛顦崝宀勫船閿燂拷
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
闂佸搫琚崕鍐诧耿閸涙潙瀚夋い鎺嗗亾缂佹锕㈠畷妤呭Ω閳轰礁濮ら柣鐘遍檷閸斿繘顢欓幋锔芥櫖鐎光偓閸愭儳娈�闂佽皫鍡╁殭缂傚稄鎷�闂佺懓鐡ㄩ悧鐐哄焵椤掑﹥瀚�濠电偛顦崝宀勫船閿燂拷
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

11
 
闂佸搫琚崕鍐诧耿閸涙潙瀚夋い鎺嗗亾缂佹锕㈠畷妤呭Ω閳轰礁濮ら柣鐘遍檷閸斿繘顢欓幋锔芥櫖鐎光偓閸愭儳娈�闂佽皫鍡╁殭缂傚稄鎷�闂佺懓鐡ㄩ悧鐐哄焵椤掑﹥瀚�濠电偛顦崝宀勫船閿燂拷
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

12
 
闂佸搫琚崕鍐诧耿閸涙潙瀚夋い鎺嗗亾缂佹锕㈠畷妤呭Ω閳轰礁濮ら柣鐘遍檷閸斿繘顢欓幋锔芥櫖鐎光偓閸愭儳娈�闂佽皫鍡╁殭缂傚稄鎷�闂佺懓鐡ㄩ悧鐐哄焵椤掑﹥瀚�濠电偛顦崝宀勫船閿燂拷
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【有奖直播】2025是德科技数字月-数字新品来助阵
直播时间:3月19日(周三)14:00
直播奖励:小米口红充电宝、倍思充电线、是德科技十周年鼠标垫

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表