5139|16

1291

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

【LPC54100】+ LPC54102双核套件固件库SPI的用法 [复制链接]

本帖最后由 强仔00001 于 2015-3-8 22:36 编辑

最近进度有点慢。现在把我SPI这部分分享下吧。这次我使用SPI0和I2C2这两个模块,I2C2负责采集MPU6050的数据,然后用OLED刷新数据。

     SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议,在LPC5410中有两个SPI的模块,分别是SPI0SPI1
SPI根据SPI时钟极性的极性和SPI时钟相位SPI时钟极性CPOL, =0表示在没有数据传输时为低电平,= 1表示没有数据传输时为高电平。SPI时钟相位CPHA= 0表示时钟的第一个沿更新数据、第二个沿锁存数据,= 1表示时钟的第一个沿锁存数据、第二个沿更新数据。如下面的几个时序图:
我这次用了LPC54102SPI0刷了小OLED。首先LPC54102套件上有个SPI / I2C brdge header,如下套件的原理图:
具体位置如下图:
板子的背面有对应的丝印文字,很容易找到。
这次没用到中断和DMA。首先我们要配置好管脚。
voidInit_SPI_PinMux(void)
{
       /* 1.3 = SPI0_SCK, 0.14 = SPI0_SSELN0,0.12 = SPI0_MOSI, 1.4 = SPI0_MISO */
       Chip_IOCON_PinMuxSet(LPC_IOCON, 1,3,  (IOCON_FUNC5 | IOCON_DIGITAL_EN |IOCON_MODE_PULLUP));
       Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 14,(IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_MODE_PULLUP));
       Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 12,(IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_MODE_PULLUP));
       Chip_IOCON_PinMuxSet(LPC_IOCON, 1,4,  (IOCON_FUNC5 | IOCON_DIGITAL_EN |IOCON_MODE_PULLUP));
}
然后进行SPI的初始化。如下函数:
根据OLED上的SSD1306提供的手册和别人的写的模拟SPI驱动,我们要选用CPOL = 0,和CPA = 0这种模式。

SSD13064线SPI的时序图:
voidSPI_Init()
{
      
       uint32_t memSize, *devMem;
       ROM_SPIM_INIT_T spimInit;
       ROM_SPIM_XFER_CONFIG_T spimConfig;
       int i;
      
       Init_SPI_PinMux();
       Chip_Clock_EnablePeriphClock(LPC_SPIM_CLOCK);
       Chip_SYSCON_PeriphReset(LPC_SPIM_RESET);
      
              /* Get needed size for drivercontext memory */
       memSize = ROM_SPIM_GetMemSize();
       if (memSize > sizeof(drvData)) {
              DEBUGOUT("Can't allocatememory for driver context\r\n");
       }
       devMem = drvData;     /* Or just use malloc(memSize) */
       /* Initialize driver */
       spimInit.pUserData = NULL;
       spimInit.base = (uint32_t) LPC_SPIM_PORT;
       spimInit.baseClockRate =Chip_Clock_GetAsyncSyscon_ClockRate();
       spimInit.spiPol[0] = 0;  /* Active low select for SSEL0 */
       spimInit.spiPol[1] = 1;
       spimInit.spiPol[2] = 1;
       spimInit.spiPol[3] = 1;
       spimHandle = ROM_SPIM_Init(devMem,&spimInit);
       if (spimHandle == NULL) {
              /* Error initializing SPI */
              DEBUGOUT("Error initializingROM\r\n");
       }
       /* Set SPI transfer configuration */
       spimConfig.dXferBitRate = SPI_BITRATE;
       spimConfig.mode =ROM_SPI_CLOCK_CPHA0_CPOL0;
       spimConfig.lsbFirst = 0;
       spimConfig.dataBits = 8;
       spimConfig.PreDelay = 3;
       spimConfig.PostDelay = 1;
       spimConfig.FrameDelay = 2;
       spimConfig.TransferDelay = 1;
       if (ROM_SPIM_SetupTransfer(spimHandle,&spimConfig) != LPC_OK) {
              DEBUGOUT("SPI configurationis invalid\r\n");
       }
       /* Show desired and actual SPI rates */
       DEBUGOUT("SPI rate = %d (actual%d)\r\n", spimConfig.dXferBitRate, spimConfig.rXferBitRate);
       /* Callback registration for assertionand de-assertion events */
       ROM_SPIM_RegisterCallback(spimHandle,ROM_SPIM_ASSERTSSEL_CB, (void *) CBspiMasterXferCSAssertCB);
       ROM_SPIM_RegisterCallback(spimHandle,ROM_SPIM_DEASSERTSSEL_CB, (void *) CBspiMMasterXferCSDeAssertCB);
}
我对这里面几个关键的参数作下说明吧:
       spimInit.spiPol[0] = 0;  /* Active low select for SSEL0 */
       spimInit.spiPol[1] = 1;
       spimInit.spiPol[2] = 1;
       spimInit.spiPol[3] = 1;
spimInit.spiPol[X]是对应的4个片选SSEL0~ SSEL3引脚。
spimConfig.dXferBitRate= SPI_BITRATE;这个是时钟频率的参数,单位是HZ

spimConfig.mode= ROM_SPI_CLOCK_CPHA0_CPOL0;这是设定SPI时钟极性的极性和SPI时钟相位的参数。如在SPI的底层中可以看到这4个参数代表了4中模式。
spimConfig.lsbFirst= 0;这个是设置开始传输的数据是最高位还是最低位。9代表开始传输的是最高位,1代表开始传输的最低位。
spimConfig.dataBits= 8;这个参数是每次传输的数据多少位,可以116bit数据之间。

spimConfig.PreDelay = 3;
spimConfig.PostDelay = 1;
spimConfig.FrameDelay = 2;
spimConfig.TransferDelay = 1;
上面这几个参数是传输时的几个延时,我这里就不作过多说明了,我也在了解中。

附上测试图:
线接的有些乱;
现在共享我的源代码:
里面集成ADXL345和MPU6050的驱动,看过时序,没问题。这次无私分享,不需要币。要赶紧研究双核怎么工作了。
SPI&&I2C.zip (6.29 MB, 下载次数: 149)



此帖出自NXP MCU论坛

最新回复

调了好久发现要把这句话去掉 mSPI_Xfer.flags = ROM_SPIM_FLAG_LOOPBACK; 才可以读取到数据,可能楼主只是需要对SPI器件进行写操作,不需要读操作,所以楼主的代码可以在楼主的条件下运行  详情 回复 发表于 2016-12-30 14:56

赞赏

1

查看全部赞赏

点赞 关注(2)
 

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
dsfds
此帖出自NXP MCU论坛

点评

这是啥意思  详情 回复 发表于 2015-3-8 19:10
 
 
 

回复

503

帖子

1

TA的资源

一粒金砂(高级)

板凳
 
双核高大上啊
不知道写程序有什么不一样
此帖出自NXP MCU论坛

点评

区别不大  详情 回复 发表于 2015-3-8 19:09
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

4
 
曾经in 发表于 2015-3-8 17:20
双核高大上啊
不知道写程序有什么不一样
区别不大



此帖出自NXP MCU论坛

点评

CPU分配由编译器处理?  详情 回复 发表于 2015-3-8 22:00
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

5
 
这是啥意思



此帖出自NXP MCU论坛
 
 
 

回复

503

帖子

1

TA的资源

一粒金砂(高级)

6
 
CPU分配由编译器处理?



此帖出自NXP MCU论坛

点评

还没了解到这么深入,正在狂砍资料  详情 回复 发表于 2015-3-8 22:23
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

7
 
曾经in 发表于 2015-3-8 22:00
CPU分配由编译器处理?

还没了解到这么深入,正在狂看资料



此帖出自NXP MCU论坛

点评

加油  详情 回复 发表于 2015-3-8 22:29
 
 
 

回复

503

帖子

1

TA的资源

一粒金砂(高级)

8
 
强仔00001 发表于 2015-3-8 22:23
还没了解到这么深入,正在狂看资料

加油


此帖出自NXP MCU论坛

点评

必须的,全是英语文档,伤不起  详情 回复 发表于 2015-3-8 22:35
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

9
 
必须的,全是英语文档,伤不起



此帖出自NXP MCU论坛
 
 
 

回复

4997

帖子

19

TA的资源

裸片初长成(初级)

10
 
不错,感谢分享。
此帖出自NXP MCU论坛

点评

感谢支持,你也有这个板子  详情 回复 发表于 2015-3-9 12:13
 
个人签名我的博客
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

11
 
zhaojun_xf 发表于 2015-3-9 08:39
不错,感谢分享。
感谢支持,你也有这个板子



此帖出自NXP MCU论坛
 
 
 

回复

4997

帖子

19

TA的资源

裸片初长成(初级)

12
 
我已经很多年不玩NXP的芯片了。
此帖出自NXP MCU论坛

点评

我是第一次接触  详情 回复 发表于 2015-3-9 12:41
 
个人签名我的博客
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

13
 
zhaojun_xf 发表于 2015-3-9 12:15
我已经很多年不玩NXP的芯片了。
我是第一次接触



此帖出自NXP MCU论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

14
 
此帖出自NXP MCU论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

15
 
楼主的 SPI0_MISO 管腿号好像定义错了吧~ 在这个brdge header里面应该是P0.13
此帖出自NXP MCU论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

16
 
调了好久发现要把这句话去掉
mSPI_Xfer.flags = ROM_SPIM_FLAG_LOOPBACK;
才可以读取到数据,可能楼主只是需要对SPI器件进行写操作,不需要读操作,所以楼主的代码可以在楼主的条件下运行
此帖出自NXP MCU论坛

点评

是的,我当时只用到写,没有读的  详情 回复 发表于 2017-1-9 21:41
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

17
 
旦丁中号 发表于 2016-12-30 14:56
调了好久发现要把这句话去掉
mSPI_Xfer.flags = ROM_SPIM_FLAG_LOOPBACK;
才可以读取到数据,可能楼主只 ...

是的,我当时只用到写,没有读的,感谢的你的分享,又get到新知识了
此帖出自NXP MCU论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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