搜索
bottom↓
回复: 3

lpc17xx spi不能读,请高手指点。

[复制链接]

出0入0汤圆

发表于 2010-9-4 18:48:50 | 显示全部楼层 |阅读模式
系统倍频时钟是96m,spi时钟8分频。想操作25aa080。软件模拟没有问题,想用硬件spi。但是不能读。请高手指点。先谢谢:

#define         SPI_CS               (1 << 16)                                 // P0.16口为片选脚
#define                CE_Low()                (LPC_GPIO0->FIOCLR |=  SPI_CS)                // 选中从器件
#define     CE_High()                (LPC_GPIO0->FIOSET |=  SPI_CS)

/*******************************************************************************************
** 函数名称:  SPIInit                                                                                                                       
** 功能说明:  初始化LPC2300系列ARM的SPI引脚及寄存器                               
** 入口参数:  无                                                                                                                               
** 出口参数:  无                                                                                                                               
*******************************************************************************************/
void  SPIInit(void)
{  
        /* 初始化SPI引脚 */
        LPC_PINCON->PINSEL0  =        0;               
           LPC_GPIO0->FIODIR         |=  SPI_CS;                // 设置SPI的片选引脚
           LPC_PINCON->PINSEL0        |=         0xc0000000;        // 设置P0.15脚为SCK脚
           LPC_PINCON->PINSEL1         =        (0x03 << 2) | (0x03 << 4);        // 设置P0.17、P0.18引脚为SPI引脚
               
        /* 初始化SPI寄存器 */                              
           LPC_SPI->SPCCR  =        0x60;                // 设置SPI时钟分频        pclk=96m spick=96/8=12m 12/12*8 = ok
        LPC_SPI->SPCR   =         (0 << 2) |        // SPI控制器每次传输发送和接收8位数据。
                                (0 << 3) |        // CPHA = 0, 数据在SCK 的第一个时钟沿采样
                                (0 << 4) |        // CPOL = 0, SCK 为高有效
                                (1 << 5) |        // MSTR = 1, SPI 处于主模式
                                (1 << 6) |        // LSBF = 0, SPI 数据传输MSB (位7)在先
                                (0 << 7);        // SPIE = 0, SPI 中断被禁止
}
/************************************************************************
** 函数名称:  SPISndByte                                                                                                       
** 函数功能:  通过硬件SPI接口发送一个字节                                       
** 入口参数:  data                                                                                                                       
** 出口参数:  无                                                                                                                               
************************************************************************/
void SPISndByte(unsigned char data)
{
           unsigned long temp = 0;
    //CE_Low();
    LPC_SPI->SPDR = data;
    while (0 == (LPC_SPI->SPSR & 0x80));        // 等待SPIF置位,即等待数据发送完毕
        temp   = LPC_SPI->SPSR;                                // 通过读S0SPSR,清除SPIF标志
        //CE_High();
        temp = temp;
}

unsigned char SPIRdByte( void )
{
#if 1
        return 0;
#else
           unsigned long temp = 0;
        unsigned char data;
    //CE_Low();
    while (0 == (LPC_SPI->SPSR & 0x80));        // 等待SPIF置位,即等待数据发送完毕
        data = LPC_SPI->SPDR;
        temp   = LPC_SPI->SPSR;                                // 通过读S0SPSR,清除SPIF标志
        //CE_High();
        temp = temp;
        return data;
#endif
}

void SPIread(unsigned int eep_adr, unsigned char *dest, unsigned char lofdstr)
{
          // lofdstr = length of the destination string
     unsigned char k=0              ;  // char counter

     CE_Low();
     SPISndByte(0x03)                             ;                  // insert READ instruction
     k = eep_adr>>8           ;
     SPISndByte(k)                       ;  // write high byte of the address
     k = eep_adr & 0xff       ;
     SPISndByte(k)                       ;  // write low byte of the address
         k=0;
         sys_debug("test 1\r\n");
     while( k < lofdstr )
         {
                *dest = SPIRdByte();
                sys_debug("test 2\r\n");
                dest++;
                k++;            
         }
     CE_High();         
}
void SPI_test(void )
{
        unsigned char magic[2]={0x55,0xaa};
        char tmpbuf[100];

        memset(magic, 0, 2);
        SPIread(0, magic, 2);
        sprintf(tmpbuf, "the magic is [0x%x-0x%x] \r\n", magic[0], magic[1]);
        sys_debug(tmpbuf);
}

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

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

出0入0汤圆

发表于 2010-9-8 10:50:50 | 显示全部楼层
(0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样
  (0 << 4) | // CPOL = 0, SCK 为高有效
这两个重点看一下你的SLAVER的SPI的时序。

出0入8汤圆

发表于 2010-9-9 23:37:46 | 显示全部楼层
老兄,你这是从模式啊,好好看看,主的时候MSTR位应该为0哦

(1 << 5) |        // MSTR = 1, SPI 处于主模式

还有SSPCLKDIV也未做设置,即分配的时钟没有搞啊,初略看了下,

出0入0汤圆

发表于 2010-9-14 13:52:15 | 显示全部楼层
用lpc21系列的arm时用过硬件spi读写spi的flash,发现必须将选通脚设置为通用output,用软件方式置高置低才正常,lz是不是也是这个问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-25 12:15

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

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