9678|17

4996

帖子

19

TA的资源

裸片初长成(初级)

楼主
 

LPC1114/LPC11U14和LPC1343对比学习(七)SSP [复制链接]

       LPC1114和LPC11U14有两路SSP总线,而LPC1343只有一路SSP总线,其他没有太大的区别,不过LPC11U14的SSP1总线都有两路管脚可以设置,进一步增加了芯片的灵活性。

 

此帖出自NXP MCU论坛

最新回复

请问,在读取LPC_ssp0->DR内的数据要先写入0XFF,谢谢!  详情 回复 发表于 2016-4-3 20:05
点赞 关注
个人签名我的博客
 

回复
举报

4996

帖子

19

TA的资源

裸片初长成(初级)

沙发
 

三种芯片的SSP总线初始化基本一致:

 

 

    但是需要注意,LPC1114和LPC1343的SSP0总线,再设置好时钟后,还必须选择时钟的输出引脚,

   

    /*SCK管脚位置选择:0x00 - P0_10, 0x01 - 0_P2_11, 0x02 - P0_6, 0x03 - 保留*/
     LPC_IOCON->SCK_LOC = SSP0_SCK_SELECT;

 

    而LPC1114的SSP1总线和LPC11U14的两路SSP总线则不需要这样设置。对于LPC1114的SSP1总线可以理解,因为没有管脚映射。但是LPC11U14却有管脚映射功能,如果没有此寄存器,如果多个管脚都设置成同一的功能,真不知道会出现什么样的效果 。就是能正常工作,感觉程序没有以前那样严谨了,不知道NXP为什么会这样设计?????????

[ 本帖最后由 zhaojun_xf 于 2011-9-3 22:31 编辑 ]
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

板凳
 

     对于SSP总线,需要知道主从设置的主要区别,在主模式下器件的片选管脚可以随意设定而不一定要总线的NSS管脚,而且就算使用此管脚也要设置成普通GPIO端口,通过程序控制器件片选。但是在从模式下从机管脚必须使用总线的NSS。

[ 本帖最后由 zhaojun_xf 于 2011-9-3 22:35 编辑 ]
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

4
 

       在使用SSP总线来控制SD卡时,SD卡的初始化必须要尽量降低SSP总线速度,一般在400K以下比较安全,如果不想降低SSP总线速度,那就必须在初始化函数中添加延时来降低速度,保证SD卡初始化成功。之后就可以加快SSP总线速度,提高SD卡读写速度。。。

[ 本帖最后由 zhaojun_xf 于 2011-9-3 22:39 编辑 ]
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

5
 

你好,SPI这样初始化有问题么?为什么初始化不了?帮忙看一下

 

void  SPI_Init(void)
{  
  LPC_SYSCON->PRESETCTRL |= (0x1<<0);
 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<11);
 /* 除以 2 */
 LPC_SYSCON->SSP0CLKDIV = 0x02; 
 LPC_IOCON->PIO0_8           &= ~0x07; 
 LPC_IOCON->PIO0_8           |= 0x01;  /* SSP MISO */
 LPC_IOCON->PIO0_9           &= ~0x07; 
 LPC_IOCON->PIO0_9           |= 0x01;  /* SSP MOSI */
#ifdef __JTAG_DISABLED
 LPC_IOCON->SCKLOC = 0x00;
 LPC_IOCON->JTAG_TCK_PIO0_10 &= ~0x07;
 LPC_IOCON->JTAG_TCK_PIO0_10 |= 0x02;  /* SSP CLK */
#else
#if 1
 /* 在 HummingBird 1(HB1), SSP CLK 可以被重定向到不同的引脚,
 而不像 JTAG TCK, 可以是 P2.11 func. 1 或 P0.6 func. 2. */
 LPC_IOCON->SCK_LOC = 0x01;
 LPC_IOCON->PIO2_11 = 0x01; /* P2.11 功能 1 是 SSP 时钟, 需要
        同时设置 IOCONSCKLOC 寄存器 */
#else
 LPC_IOCON->SCK_LOC = 0x02;
 LPC_IOCON->PIO0_6 = 0x02; /* P0.6 功能 2 是 SSP 时钟, 需要
        同时设置 IOCONSCKLOC 寄存器 */
#endif
#endif /* endif __JTAG_DISABLED */ 

#if USE_CS
 LPC_IOCON->PIO0_2 &= ~0x07; 
 LPC_IOCON->PIO0_2 |= 0x01;  /* SSP SSEL */
#else
 /* 使能 AHB 到 GPIO 时钟  */
 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);

    /* SSP SSEL 是 GPIO 引脚 */
 LPC_IOCON->PIO0_2 &= ~0x07;  
 /* port0, 第 2 位设置为 GPIO 输出并为高 */
 GPIOSetDir( PORT0, 2, 1 );
 GPIOSetValue( PORT0, 2, 1 );
#endif

 LPC_SSP0->CR0=(0x07<<0)|
               (0x00<<4)|
      (0x00<<6)|
      (0x00<<7)|
      (0x07<<8);

 LPC_SSP0->CR1=(0x00<<0)|
               (0x01<<1)|
      (0x00<<2)|
      (0x00<<3);
  /* SSPCPSR 时钟分频器,主模式,最小分频系数 0x02 */
 LPC_SSP0->CPSR = 0x2;
 LPC_SSP0->ICR= 0x03;
 LPC_SSP0->IMSC = SSPIMSC_RORIM | SSPIMSC_RTIM;


}

此帖出自NXP MCU论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

6
 
给你个代码,参照一下吧:

/**************************************************************************************
* FunctionName   : SSPInit()
* Description    : 初始化SSP总线
* EntryParameter : spiNum - 总线选择(1,2)
* ReturnValue    : None
**************************************************************************************/
void SSPInit(uint8 spiNum)
{
    SSP_SetGpio(spiNum);                                                                   // 端口设置

    if (spiNum == 0)                        // SSP0
        {
            LPC_SYSCON->PRESETCTRL |= (0x01 << 0);             // 禁止SSP0复位
            LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 11);            // 打开SSP0外设
            LPC_SYSCON->SSP0CLKDIV = 0x02;                     // SSP0时钟分频
       
                /* Set DSS data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0, and SCR is 15 */
                //LPC_SSP0->CR0 = 0x0707;
            LPC_SSP0->CR0 = (0x07 << 0) |                      // 每帧数据长度为8位
                                    (0x00 << 4) |                      // 设置帧格式为 SPI
                                    (0x00 << 6) |                      // 设置空闲时SCK为高电平有效
                                    (0x00 << 7) |                      // 数据在SCK的第一个时钟沿采样
                                    (0x07 << 8) ;                      // 设置SSP通讯位速率为默认值
               
               
            //LPC_SSP0->CR1 = SSP0CR1_SSE;                                       // Master mode
                LPC_SSP0->CR1 = (0x00 << 0) |                      // 不使用回写模式
                                        (0x01 << 1) |                      // 设置SSP使能
                                        (0x00 << 2) |                      // SSP用作主机模式
                                         (0x00 << 3) ;                      // 从机输出禁能
       
                /*SCK管脚位置选择:0x00 - P0_10, 0x01 - 0_P2_11, 0x02 - P0_6, 0x03 - 保留*/
            LPC_IOCON->SCK_LOC = SSP0_SCK_SELECT;
       
                /* SSPCPSR clock prescale register, master mode, minimum divisor is 0x02 */
                LPC_SSP0->CPSR = 0xF2;                             // PCLK分频值
            LPC_SSP0->ICR = 0x03;                              // 中断清除寄存器
       
                /* Set SSPINMS registers to enable interrupts */
            /* enable all error related interrupts */
            LPC_SSP0->IMSC = SSP0IMSC_RORIM | SSP0IMSC_RTIM;   // SSPn中断使能设置
        }
        else                                                // SSP1
        {
                LPC_SYSCON->PRESETCTRL |= (0x01 << 2);             // 禁止SSP1复位
            LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 18);            // 打开SSP1外设
            LPC_SYSCON->SSP1CLKDIV = 0x02;                     // SSP1时钟分频
       
                /* Set DSS data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0, and SCR is 15 */
                //LPC_SSP1->CR0 = 0x0707;
            LPC_SSP1->CR0 = (0x07 << 0) |                      // 每帧数据长度为8位
                                    (0x00 << 4) |                      // 设置帧格式为 SPI
                                    (0x00 << 6) |                      // 设置空闲时SCK为高电平有效
                                    (0x00 << 7) |                      // 数据在SCK的第一个时钟沿采样
                                    (0x07 << 8) ;                      // 设置SSP通讯位速率为默认值
               
               
            //LPC_SSP1->CR1 = SSP1CR1_SSE;                                       // Master mode
                LPC_SSP1->CR1 = (0x00 << 0) |                      // 不使用回写模式
                                        (0x01 << 1) |                      // 设置SSP使能
                                        (0x00 << 2) |                      // SSP用作主机模式
                                         (0x00 << 3) ;                      // 从机输出禁能
       
                /* SSPCPSR clock prescale register, master mode, minimum divisor is 0x02 */
                LPC_SSP1->CPSR = 0x52;                             // PCLK分频值
       
            LPC_SSP1->ICR = 0x03;                              // 中断清除寄存器
       
                /* Set SSPINMS registers to enable interrupts */
            /* enable all error related interrupts */
            LPC_SSP1->IMSC = SSP1IMSC_RORIM | SSP1IMSC_RTIM;   // SSPn中断使能设置/清除寄存器
        }
}
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

7
 

我对照了,初始化没有问题,除了你的这个函数SSP_SetGpio(spiNum); // 端口设置,不知道你是怎么设置的SCK的管脚呢?

此帖出自NXP MCU论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

8
 

回复 7楼 liuying87112 的帖子

管脚需要注意选择哪一个管脚为时钟管脚,出来把它设置为SCK外SSP0还得注意:
LPC_IOCON->SCK_LOC = SSP0_SCK_SELECT;  // 选择是哪一个为时钟
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

9
 
/**********************************************************/
/*  函数名称 :  SPI_WR                                */
/*  函数功能 : 通过SPI发送一个字节的数据                 */
/*  参数     :  待发送的字节数据                          */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void  SPI_WR(uint8_t c)
{  
    while ( (LPC_SSP0->SR & (SSPSR_TNF|SSPSR_BSY)) != SSPSR_TNF );  
 LPC_SSP0->DR = c;
 while(((LPC_SSP0->SR) & 0x80) == 0);  //等待SPI将数据发送完毕
}  您好,请问发送一个字节的数据这个函数为什么到第二个while()那里程序就死掉了?这样写有什么问题么?
此帖出自NXP MCU论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

10
 

回复 8楼 zhaojun_xf 的帖子

好的谢谢、
此帖出自NXP MCU论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

11
 

回复 9楼 zhouxiaofang 的帖子

我真不知道你第二句是什么意思,在SR寄存器中我没有发现0x80有什么意义

 

[ 本帖最后由 zhaojun_xf 于 2011-9-27 13:37 编辑 ]

1.JPG (114.77 KB, 下载次数: 0)

1.JPG
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

12
 

是我理解错误,这样写是不是就OK啦?

uint8_t   SPI_WR(uint8_t dat)
{  
     LPC_SSP0->DR = dat;

 while ( (LPC_SSP0->SR & (SSPSR_TNF|SSPSR_BSY)) != SSPSR_TNF )
    {;}
    return (LPC_SSP0->DR);
}

此帖出自NXP MCU论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

13
 

回复 12楼 zhouxiaofang 的帖子

是的
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

14
 

您好

您好,我用SPI读一个字节为什么总是不成功?代码如下:
uint8_t SPI_RD(void)
{
  LPC_SSP0->DR = 0xFF;
          while ( (LPC_SSP0->SR & (SSPSR_TNF|SSPSR_BSY)) != SSPSR_TNF )
    {;}
    return (LPC_SSP0->DR);
}
能帮忙看一下么?
此帖出自NXP MCU论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

15
 

上边的弄错了

程序为uint8_t SPI_RD(void)
{
  LPC_SSP0->DR = 0xFF;
          while ( (LPC_SSP0->SR & (SSPSR_RNE|SSPSR_BSY)) != SSPSR_RNE )
    {;}
    return (LPC_SSP0->DR);
}
但是还是不行,不知道为什么
此帖出自NXP MCU论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

16
 

回复 15楼 zhouxiaofang 的帖子

程序看不错问题,恐怕不一定是这里的问题,好好找找
此帖出自NXP MCU论坛

点评

请问,在读取LPC_ssp0->DR内的数据要先写入0XFF,谢谢!  详情 回复 发表于 2016-4-3 20:05
 
个人签名我的博客
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

17
 
观察内存1中地址为0x40040008(ssp0地址)的数据与写入的DR的数据不一致。请问怎么判断写入数据与DR数据那个正确。如何调整?
此帖出自NXP MCU论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

18
 
zhaojun_xf 发表于 2011-10-18 16:08
程序看不错问题,恐怕不一定是这里的问题,好好找找

请问,在读取LPC_ssp0->DR内的数据要先写入0XFF,谢谢!
此帖出自NXP MCU论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
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
快速回复 返回顶部 返回列表