搜索
bottom↓
回复: 1

nuc100的SPI-sd的初始化的一点疑问。

[复制链接]

出0入0汤圆

发表于 2010-11-22 16:01:48 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvSPI.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "DrvUART.h"


void UARTSPI_INIT()
{
          STR_UART_T param;
   
        /* Unlock the protected registers */       
        UNLOCKREG();

        /* Enable the 12MHz oscillator oscillation */
        DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);

        /* Waiting for 12M Xtal stable */
        DrvSYS_Delay(5000);

        /* HCLK clock source. 0: external 12MHz; 7:internal 22MHz RC oscillator */
        DrvSYS_SelectHCLKSource(0);

        LOCKREG();

        DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0); /* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */

        DrvGPIO_InitFunction(E_FUNC_UART0);
       
        /* Select UART Clock Source From 12MHz */
        DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0);
       
        param.u32BaudRate        = 115200;
        param.u8cDataBits        = DRVUART_DATABITS_8;
        param.u8cStopBits        = DRVUART_STOPBITS_1;
        param.u8cParity          = DRVUART_PARITY_NONE;
        param.u8cRxTriggerLevel  = DRVUART_FIFO_1BYTES;
        param.u8TimeOut                 = 0;
        DrvUART_Open(UART_PORT0, &para;m);


        DrvSYS_SetIPClock(E_SYS_SPI0_CLK,1); //打开时钟
           DrvGPIO_InitFunction(E_FUNC_SPI0); // 使能 IO口的 SPI 功能  
   
        DrvSPI_Open(eDRVSPI_PORT0,eDRVSPI_MASTER,eDRVSPI_TYPE1,8, FALSE);//设置SPI0为主机模式,8bit传输
                                                                                                                                        //32bit其他模式,传输模式为1
        DrvSPI_DisableAutoSS(eDRVSPI_PORT0); //关闭SPI0的自动CS功能
        DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT0, eDRVSPI_ACTIVE_LOW_FALLING);//设置数据传送接收时序
        DrvSPI_SetEndian(eDRVSPI_PORT0, eDRVSPI_MSB_FIRST);//设置MSB传输
        DrvSPI_SetClockFreq(eDRVSPI_PORT0,10000,10000);        //设置频率
           DrvSYS_Delay(0x20000);                   //延时

        printf("\nOpen UART success\n");

}
uint32_t SPI_WriteByte(uint32_t val)
{
        uint32_t auSendSPIData[2];
        uint32_t auReadSPIData[2];

        auSendSPIData[0]=val;
        auSendSPIData[1]=val;
       
        if(DrvSPI_SingleWrite(eDRVSPI_PORT0,&auSendSPIData[0])==FALSE)
                printf("\n\nWrite Data is fail\n\n");
        while(DrvSPI_IsBusy(eDRVSPI_PORT0));
        DrvSPI_DumpRxRegister(eDRVSPI_PORT0,&auReadSPIData[0],1);

//        printf("\n--- %x --- \n",auReadSPIData[0]);

        return auReadSPIData[0];
}
uint32_t SD_SendCommand(uint8_t cmd,uint32_t arg,uint8_t crc)
{
        uint32_t r1;
        uint32_t Retry=0;      //重复操作次数

        DrvSPI_SetSS(eDRVSPI_PORT0, eDRVSPI_SS0);
        SPI_WriteByte(0xff);  
        SPI_WriteByte(0xff);
        SPI_WriteByte(0xff);

        DrvSPI_ClrSS(eDRVSPI_PORT0, eDRVSPI_SS0);                        //使能片选信号

        SPI_WriteByte(cmd | 0x40);   //分别写入命令
        SPI_WriteByte(arg>>24);      //数据段第4字节
        SPI_WriteByte(arg>>16);      //数据段第3字节
        SPI_WriteByte(arg>>8);       //数据段第2字节
        SPI_WriteByte(arg);          //数据段第1字节
        SPI_WriteByte(crc);         //CRC效验和

        while((r1 = SPI_WriteByte(0xff)) == 0xff)//等待响应
                  if(Retry++ > 200)
                                 break;//超时退出     
     
        DrvSPI_SetSS(eDRVSPI_PORT0, eDRVSPI_SS0);                        //清除片选信号

        SPI_WriteByte(0xff);
        return r1;                   //返回状态值
       
}
void MMC_FLASH_Init()
{
        uint32_t Counter = 0;
        uint32_t r1=0;
       
        for(Counter = 0 ; Counter < 0xf00; Counter++);//延时等待SD卡上电
        for(Counter = 0 ; Counter < 10; Counter++)  SPI_WriteByte(0xff);  //输入74个脉冲等待SD卡初始化
        do
        {
                r1 = SD_SendCommand(0,0,0x95);        //发idle命令
                printf("\nR1: %x ",r1);       
        }while(r1!=0x01);
}

int32_t main()
{
//        uint32_t R1=1;
        UARTSPI_INIT();
        MMC_FLASH_Init();
        while(1){}
}

大家好,这个是小弟写的一个初始化代码,单是返回来的全部是0xff。请教大家,是什么原因。有什么检测方法

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-11-23 07:55:43 | 显示全部楼层
。。。。。。。。。。。。。。。。。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 19:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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