McBSP是多通道缓冲串行口,DM6437提供了McBSP0&McBSP1两个串行口,每个串行口有7个管脚,可以支持多通道串行数据通信。
MCBSP的内部框图:
这两个端口也支持时钟停止模式,内部FSR与FSX、CLKX与CLKR连接在一起,这时候DX为MOSI,,DR为MISO,CLKX为SCK和FSX为nSS。
配置SPI口要注意的地方:通信模式选择要一致;SPI提供了四种通信模式:SPI0、SPI1、SPI2、SPI3。
McBSP通过配置CLKSTP与CLKXP来设置这四种模式:
一般而言SPI0模式采用的多一些。
SPI初始化步骤:
在这之前还有两个操作必须完成,DM6437的管脚复用设置为McBSP模式、McBSP的IO上电。(可以直接写相关寄存器、或者调用CSL函数),管脚复用只是设置DSP芯片管脚的引出方式,McBSP会有一个特殊情况,需要检测第一个帧同步信号;这个时候就可以复用FSX脚为GPIO脚,用GPIO来检测信号的变化,因此我们有理由相信无论用户采用配置出来是什么形态,内部这些脚其实是连在一起的。另外还申明一个误区:管脚复用和接口寄存器配置并没有关系,用户可以随时配置McBSP接口的相关寄存器,而不需要指定这些脚已经映射为McBSP管脚;当然还是得满足IO上拉的条件。
DM6437 SPI Master Config
DM6437 SPI Slaver Config
编写程序可以根据CSL库提供的函数,可能看到TI针对DM6437不再提供CSL驱动了,而是提供PSP驱动;但是这话不绝对,TI还是有DM6437可用的CSL库函数可以用,但是对我而言采用的是CSL提供的定义,自己编写函数;因为我找到了CSL支持的寄存器数据结构,但是没有找到相应的CSL函数说明,没有看到函数原型。
配置SPI口其实是很简单的,虽然我花费了太多的时间,这个最后我会说明,自己配置寄存器,可以很简单的直接给寄存器赋值,只要计算好该寄存器最后的值是什么直接赋值就可以了,但是需要注意复位脚设置什么的。。。该延时的要延时。这种寄存器配置一般而言没有什么先后顺序,没有什么要求;有要求的文档会有标注。如果不是一次性设定寄存器的值,那么在设置寄存器的时候一定要很小心取与取或的时候不要覆盖了前面的设置;这个因为我第一次是一位一位设置的,没有注意;到得到的和自己想要的完成是两回事。推荐一次性设置,当然可读性不就会这么好,可读性可以在程序跑通了再追求。
PSP_103什么版本的,如果自己电脑上面正好有这个驱动,那么直接调用,那就可以很简单了,和填空差不多了。LLC提供了底层驱动的,这个部分和自己配置寄存器一样的道理,DDC为驱动核心层,提供了OS与底层的交互,也就是我们常说的PSP驱动了;BIOS是上层系统层调用了。如果对PSP熟悉,那么可以自己决定程序写在哪一层,这个就是DM6437与DM642最大的不同。一般而言,我喜欢直接操作底层,从DM642养成的习惯。
另外说一下SPI数据通信的能力:
如果主设备采用内部时钟,则SPI内部时钟为CPU时钟/6,因为主设备和从设备要保持同步,却又采用各自的时钟,所以必须保证从设备拥有同步能力,从设备的时钟必须大于主设备时钟8倍,从设备通常默认设置到最大时钟能力、即CLKDVG=1。
另外数据的传输方式也会对数据通信能力有很大引向,McBSP提供了三种方式:CPU查询模式、CPU中断模式、EDMA3模式。采用EDMA3模式可以获得最大的数据通信能力,当然驱动编写就复杂一些,如果采用PSP倒也罢了。
最后说一下在调试中遇到的问题:
1) 配置寄存器,一位一位配置,得到很意外的结果,最后一步一步跟踪才找到原因。
2) 根据文档配置SPI口,但是就是不能正常通信。后来查找SPI协议,了解了SPI口相关知识,才知道CLKXP并不能随意配置
3) 配置好SPI口,左看右看程序没有问题,但是就是不能正常通信,逐个检测管脚状态,发现DR脚,没有连接时,都有波形输出,倒是数据采样不对,换另一个端口,终于正常通信了。
void SPI_Slave_Init ( unsigned long Bits )
{
unsigned long i;
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_FRST,RESET); //frame sync reset
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_XRST,DISABLE); //transmitter reset
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_RRST,DISABLE); //receiver reset
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_GRST,CLKG); //SRGR reset
//serial port control register SPCR
mcbsp0Regs->SPCR = CSL_FMKT(MCBSP_SPCR_CLKSTP,DELAY); //In SPI mode, data sampled on rising edge with delay
//pin control register
mcbsp0Regs->PCR = CSL_FMKT(MCBSP_PCR_FSXM,EXTERNAL) //external frame sync
| CSL_FMKT(MCBSP_PCR_CLKXM,INPUT) //trans clock mode
| CSL_FMKT(MCBSP_PCR_FSXP,ACTIVELOW); //active low
//sample rate generator SRGR
mcbsp0Regs->SRGR = CSL_FMKT(MCBSP_SRGR_CLKSM,INTERNAL) //internal clock
| CSL_FMK(MCBSP_SRGR_CLKGDV,1); //clock divider value
switch ( Bits )
{
case SPI_8BIT:
// receive control register
mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,8BIT); //receive word 8bit
//transmit control register
mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,8BIT); //trans word 8bit
break;
case SPI_12BIT:
// receive control register
mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,12BIT); //receive word 12bit
//transmit control register
mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,12BIT); //trans word 12bit
break;
case SPI_16BIT:
// receive control register
mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,16BIT); //receive word 16bit
//transmit control register
mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,16BIT); //trans word 16bit
break;
case SPI_20BIT:
// receive control register
mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,20BIT); //receive word 20bit
//transmit control register
mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,20BIT); //trans word 20bit
break;
case SPI_24BIT:
// receive control register
mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,24BIT); //receive word 24bit
//transmit control register
mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,24BIT); //trans word 24bit
break;
case SPI_32BIT:
// receive control register
mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,32BIT); //receive word 32bit
//transmit control register
mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,32BIT); //trans word 32bit
break;
default:;
}
//start the mcbsp running
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_GRST,CLKG); //SRGR out of reset
for ( i = 0; i < 200; i++ ) { i++; }
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_RRST,ENABLE); //receiver enable
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_XRST,ENABLE); //transmitter enable
for ( i = 0; i < 200; i++ ) { i++; }
CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_FRST,FSG); //enable frame sync
}
关键字:DM6437 McBSP SPI ARM S2440通信
引用地址:
利用DM6437的McBSP配置SPI与ARM_S2440通信
推荐阅读最新更新时间:2024-03-16 14:51
除了海思麒麟 华为在ARM芯片上还有哪些成就?
在麒麟950的发布会上,华为宣布用于服务器的自主芯片正在紧锣密鼓的研发中。其实,正在开发ARM服务器芯片的远远不止华为,国防科大、高通、AMD等IC设计单位或公司都已经设计出或正在设计ARM服务器芯片。
相对于ARM的32位指令集授权上的谨慎,ARM对其的64位指令集授权则显得非常大方,除了拉拢ARM阵营IC设计公司冲击服务器芯片市场外,也有ARM的64位指令集自身的原因。
其实,当初的ARM的64位指令和32位指令不是一回事,两者无法像MIPS64和MIPS32,X86 64和X86 32那样完全兼容。ARM的64位指令某种程度上是重新定义过的,在软件上与ARM 32位指令无法兼容,只有
[手机便携]
基于MDK-ARM创建STM32L-DISCOVERY Project
本文只针对使用MDK-ARM建立软件开发环境,并基于STM32L1xx_StdPeriph_Lib_V1.1.1库及其Examples,其余情况可参考UM1451 User manual Getting started with software development toolchains for the STM32L-DISCOVERY board (后续会补充一般情况下创建STM32L MDK Project说明) 1. 安装Keil uVision4 2. 下载获得STM32L1xx_StdPeriph_Lib_V1.1.1.zip压缩包,解压到H:STM32L1xx_StdPeriph_Lib_V1.1.1,内部
[单片机]
ARM CEO看物联网 好上手就大卖
安谋执行长Simon Segars演说摘要 全球矽智财(IP)授权龙头厂安谋执行长Simon Segars于2日的2014年科技论坛(ARM TechCon 2014)上指出,物联网是推动半导体产业新一波成长的驱动力。Simon Segars认为,物联网终端产品一旦免阅读产品说明书,让消费者易于使用一定会大卖。 Simon Segars表示,人们所看到的智慧型手机、穿戴式装置、智慧车、医疗照护、节能环保建设等将被智慧化的产品,将在不久的未来建构出物物相联的物联网环境。这些看得到的终端产品,就像是冰山、红树林,而半导体产业就是未浮出水面的冰山、和盘根错节的红树林树根。光看冰山、红树林的表面就已经很壮观了,若再窥视在水面下的
[手机便携]
基于ARM11的IMX35车载信息娱乐模块的开发
车载信息娱乐系统(In-Vehicle Infotainment 简称IVI),是采用车载专用中央处理器,基于车身总线系统和互联网服务,形成的车载综合信息处理系统。IVI能够实现包括三维导航、实时路况、IPTV、辅助驾驶、故障检测、车辆信息、车身控制、移动办公、无线通讯、基于在线的娱乐功能及TSP服务等一系列应用,极大的提升的车辆电子化、网络化和智能化水平。 车载信息娱乐系统在汽车驾乘的舒适度上起到了决定性的作用,从而使得汽车娱乐系统在近些年得到了飞速发展。其中不仅有用户对多媒体娱乐的要求在逐步增高;而且由于汽车电子软硬件技术的不断发展,也使得各种各样的汽车娱乐系统应用实现成为可能。通过铜缆发送音频数据的简单音频系统已
[单片机]
基于S3C6410的ARM11学习(七) 核心初始化之关闭MMU和CACHE
在关闭了所有中断后,就要关闭MMU和CACHE了。因为这个时候,还在初始化环境,这两个东西是用不到的。所以就需要把他们都关闭,免得影响我们的初始化。 MMU是Memory Management Unit的缩写,中文名是存储器管理单元。主要是两个功能: 1、虚拟地址转换为物理地址 2、实现内存的保护 至于具体的MMU的一些知识,等后面用到了在说明了。目前,只需要将MMU给关掉即可。 这个时候,我们需要查看S3C6410的核ARM1176JZFS手册。在这里,我们要接触到一个系统控制处理器,CP15。也叫做协处理器。 手册中说明了,CP15系统控制处理器的作用,主要是6个: 1、整个系统的控制和配置 2、CACHE的
[单片机]
ARM之后还有谁,还是只怪对手太强大?
本月初,彭博社援引知情人士消息称,全球最大的手机芯片制造商高通准备放弃开发数据中心服务器芯片。知情人士还表示,高通还在考虑两种选择,关闭这项业务或者为其寻找新的买家。下面就随嵌入式小编一起来了解一下相关内容吧。 而就在在去年底,高通还非常高调的正式发布了他们进军服务器市场的芯片centriq2400,当时各类媒体的报道铺天盖地,有吹捧它性能如何高超,对比Intel有多少优势,还有报道谷歌已经采纳高通的处理器方案,将用在自己的数据中心,一切看起来那么美好。 和几年前 ARM 阵营的其他挑战者一样的措辞,一样的市场预测,当然这也导致了一样的结果,就是完全退出这个市场。 只是谁也没有想到高通的产品发布只有半年就退出,
[嵌入式]
【ARM】s3c2410中断处理实例
目的 为了更好地掌握S3C2410中断的原理及中断程序的编写。 内容利用S3C2410的外部中断0和外部中断1实现两个按键功能 原理 本次选择的是外部中断EXTINT0和EXTINT11。中断的产生分别来自按钮SB1202和SB1203,当按钮按下时,EXTINT0(对应管脚GPF0)或EXTINT11(对应管脚GPG3)和地连接,输入低电平,从而向CPU发出中断请求。 当CPU受理后,进入相应的中断服务程序,通过超级终端的主窗口显示当前进入的中断号。 程序 #include 2410addr.h //这头文件找了好久啊,mdk里面没有,后来在一个实例中提取出来的 #include 2410lib.
[单片机]
基于ARM的车载GPS定位终端的设计
1 引言 车载GPS定位终端在过去十年内已经成为汽车工业发展的焦点。在欧美国家和日本,车载GPS定位终端在最近几年内得以广泛的应用。车载GPS定位终端是融全球卫星定位技术(GPS)和现代无线通信技术于一体的高科技系统。该终端的主要功能是通过GPS模块从卫星获取GPS数据,将移动车辆的动态位置(经度、纬度、时间、速度)等信息实时地通过无线通信链路上传至监控中心,同时接收监控中心发送的控制命令。目前的车辆监控系统中大多采用GSM通信网以短信息的方式进行通信,不能充分满足实际应用的需要。而GPRS(General Packet Radio Service)通用分组无线业务是一种以分组交换技术为基础,采用IP数据网络协议的高效数据传输网
[单片机]