打印
[ZLG-ARM]

请问周工如何在2148下把SSP配置成SPI模式

[复制链接]
2233|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
justcool|  楼主 | 2008-1-2 23:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不知道使用ZLG的SD卡驱动的话,需要调整什么配置吗?SD卡初始化这一块通过了,但是试图写一块数据的时候,当走到SD_WriteBlockData这个函数时,返回了SD_ERR_DATA_RESP这个错误码,不知是什么原因呢?

相关帖子

沙发
zlgarm| | 2008-1-3 13:27 | 只看该作者

看看你的时钟频率要求

不知你用的晶振频率是多少,SD卡驱动中,SPI速率是在11M的晶振上设计的,而且要保证SPI的时钟计数寄存器S0SPCCR中的值为大于8的偶数.

如果要将SSP作为SPI模式的话,需要设置SSP的控制寄存器0,即SSPCR0和SSP控制寄存器1 SSPCR1的相关位,具体你可以参考<<深入浅出ARM7—LPC213x/lpc214x>>中的SSP控制器这一章。
                                 By zlgarm_zhp

使用特权

评论回复
板凳
justcool|  楼主 | 2008-1-3 21:15 | 只看该作者

呵呵

谢谢周工,我现在用的是12M的晶振,以下是两个主要寄存器的设置值,不知正确否,现在无论是发送擦除命令还是写命令都是发送指令帧后SD卡返回的回应帧不为0,是4,这是否代表是对方返回非法指令回应呢,
    SSPCR0 = 0x0707;
    SSPCPSR = 0x2;

以下是SPI发送和接收函数
void SPI_SendByte (uint8 ucByte)
{
    uint8 ucDummy;

    while (!(SSPSR & 0x02));

    SSPDR = ucByte;

    while (!(SSPSR  & 0x04));

    ucDummy = SSPDR;
}

uint8 SPI_ReceiveByte (void)
{
    uint8 ucData;

    SSPDR = 0xFF;

    while (SSPSR & 0x10);
    ucData = SSPDR;

    return (ucData); 
}

使用特权

评论回复
地板
justcool|  楼主 | 2008-1-4 11:56 | 只看该作者

郁闷

我现在初始化都没问题,就是擦除或者读写的时候都不行,返回#define   SD_ERR_DATA_RESP          0x22            // 写单块或多块时,SD卡数据响应令牌不正确



/* 下面为SD卡使用的硬件条件配置,用户可根据实际需要修改 */

/* SCK引脚 */
#define  SPI_SCK                (0x01 << 17)                     
#define  SPI_SCK_GPIO()         PINSEL1 &= ~(0x03 << 2)         /* 设置 SCK 口为GPIO口 */
#define  SPI_SCK_OUT()          IO0DIR |= SPI_SCK                /* 设置 SCK 口为输出口 */
#define  SPI_SCK_CLR()          IO0CLR |= SPI_SCK                 /* 置 SCK 为低电平 */   

/* MISO 引脚 */ 
#define  SPI_MISO               (0x01 << 18)                     
#define  SPI_MISO_GPIO()        PINSEL1 &= ~(0x03 << 4)        /* 设置 MISO 口为GPIO口 */
#define  SPI_MISO_OUT()         IO0DIR |= SPI_MISO               /* 设置 MISO 口为输出口 */
#define  SPI_MISO_CLR()         IO0CLR |= SPI_MISO                /* 置 MISO 为低电平 */

/* MOSI 引脚 */ 
#define  SPI_MOSI               (0x01 << 19)
#define  SPI_MOSI_GPIO()        PINSEL1 &= ~(0x03 << 6)        /* 设置 MOSI 口为GPIO口 */
#define  SPI_MOSI_OUT()         IO0DIR |= SPI_MOSI               /* 设置 MOSI 口为输出口 */
#define  SPI_MOSI_CLR()         IO0CLR |= SPI_MOSI                /* 置 MISO 为低电平 */

/* CS 引脚 */       
#define  SPI_CS                 (0x01 << 20)                     
#define  SPI_CS_GPIO()          PINSEL1 &= ~(0x03 << 8)        /* 设置 CS 口为GPIO口 */
#define  SPI_CS_OUT()           IO0DIR |= SPI_CS;                /* 设置 CS 口为输出口 */
#define  SPI_CS_SET()           IO0SET |= SPI_CS;                /* 置 CS 为高电平 */
#define  SPI_CS_CLR()           IO0CLR |= SPI_CS;                /* 置 CS 为低电平 */

/* 初始化 IO 口为SPI接口 */
#define  SPI_INIT() PINSEL1 &= ~((0x03 << 2) + (0x03 << 4) + (0x03 << 6) + (0x03 << 8)); 
                                PINSEL1 |= (0x02 << 2) + (0x02 << 4) + (0x02 << 6)+ (0x02 << 8);

请周工指点一下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

12

帖子

1

粉丝