基于DSP的McBSP串口操作(汇编语言)
McBSP模拟UART通信
基于TMS320C6416T DSK的McBSP和EDMA实现串口通信针对TI公司的DSP芯片TMS320C6416T DSK,利用片上同步多通道缓冲串行口(McBSP)和增强型直接存储器存取(EDMA)实现了串口通信功能。
该方案解决了芯片只有同步串口而不能进行异步传输的问题,丰富了接口功能。
数字信号处理器因其高性能及强大的数据处理能力,而在通信和信号处理、自动控制等领域得到越来越广泛的应用。
TMS320C6416T(简称C6416T)作为TI公司TMS320C6000系列的DSP,经常被用于图像、语音处理等方面。
在大多数应用系统中,往往需要实现DSP 与PC机或者其他外设之间的异步串行通信。
但C6416T所提供的串口是同步串口,并不支持通用异步串行收发器标准。
本文设计了一种利用C6416T已有的同步串口McBSP与EDMA 实现异步串口通信的方法。
1.硬件接口电路设计C6416T有三个McBSP(McBSP0,McBSP1,McBSP2)口,每个端口有7 个引脚,除数据收发引脚(DX、DR) 之外,还包括发送时钟(CLKX)、接收时钟(CLKR)、发送帧同步(FSX)、接收帧同步(FSR)和外部输入时钟(CL KS)等引脚,分别用于传送数据、时钟和帧同步,实现同步串行通信。
当McBSP工作在串行口方式时,McBSP与串口的连接图如图1所示。
对于McBSP 而言,不论外部如何连接,始终认为工作在同步方式下。
当串口发送的数据中有帧信息和数据信息时,串口的TxD与McBSP的DR、FSR相连,就可以将数据线上的电平跳变直接引入到FSR端;当FSR检测到数据线上一帧的第一个下跳沿时,McBSP认为帧同步信号到来。
图1. C6416T与UART设备的连接由于PC的串口输出输入电压与DSP的电压不同,所以我们需要一个转换电路接口。
这里我们使用APC220-43进行电平的转换。
其中4号管脚连接DR和FSR,5号管脚连接DX。
实验4 CODEC以及MCBSP实验
北京交通大学 国家工科电工电子教学基地
DSP应用技术
2.A/D、D/A转换器的初始化与编程(续)
/* 16KHz sampling rate */ codec_sample_rate(hHandset,SR_16000);
函数原型在codec.h中,源程序在drv5402.lib和 dsk5402.lib中
在实验4 信号发生实验中介绍过,从略。
4 4
北京交通大学 国家工科电工电子教学基地
DSP应用技术
2.A/D、D/A转换器的初始化与编程
/* Open Handset Codec */ hHandset = codec_open(HANDSET_CODEC); /* Set codec parameters */ /* DAC and DAC in 15-bit mode */ codec_dac_mode(hHandset, CODEC_DAC_15BIT); codec_adc_mode(hHandset, CODEC_ADC_15BIT); /* 6dB gain on analog input to ADC */ codec_ain_gain(hHandset, CODEC_AIN_6dB); /* -6dB gain on analog output from DAC */ codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB);
12 12
北京交通大学 国家工科电工电子教学基地
DSP应用技术
McBSP接口的数据接收和发送
数据接收,即读外部数据: 数据从DR引脚进入,首先存放在接收移位寄存器 RSR[1,2]中,当一个完整的字接收完毕后,结果将 被复制到接收缓冲寄存器RBR[1,2],最后再由 RBR[1,2]复制到DRR[1,2]中,供CPU和DMA控制器访问。 发送数据,即写操作:与读操作相仿。 数据首先写入DXR[1,2],然后送入发送移位寄存器 XSP[1,2],通过移位最后送到DX。 发送和接收部分相对独立,可实现全双工通信。
DSP 第11讲 McBSP
5~4
XINTM
3
XSYNCERR
发送同步错误。 XSYNCERR=0时,无发送同步错误 XSYNCERR=1时,McBSP检查到发送同步错误
发送移位寄存器(XSR[1,2])空 /XEMPTY=0时,XSR[1,2]为空 /XEMPTY=1时,XSR[1,2]不为空 发送准备好 XRDY=0时,发送器没有准备好 XRDY=1时,发送器准备好发送DXR[1,2]中的数据 发送器复位,可以复位和使能发送器 XRST=0时,串行接口发送器被禁止并且处于复位状态 XRST=1时,串行接口发送器被使能
80
保留 CLKS_STAT DX_STAT DR_STAT FSXP FSRP CLKXP CLKRP
14~13
RJUST
12~11
CLKSTP
l0~8
保留
§11.3 McBSP的配置—SPCR1、SPCR2、PCR
位 7 6 名 称 DXENA ABIS 功 能 DX使能位 DXENA=0时,DX使能关;DXENA=1时,DX使能开 ABIS模式 ABIS=0时,禁止ABIS模式;ABIS=1时,使能ABIS模式 接收中断模式 RINTM=00时,接收中断RINT由RRDY(字结束)和ABIS模式下的帧结束信号驱动 RINTM=01时,接收中断RINT由块结束或多通道操作下的帧结束信号产生 RINTM=10时,接收中断RINT由一个新的帧同步信号产生 RINTM=11时,接收中断RINT由RSYNCERR产生 接收同步错误 =0时,无接收同步错误; =1时,McBSP检查到接收同步错误
发送帧同步模式位 FSXM=0时,帧同步信号由外部器件驱动 FSXM=1时,采样率发生器的帧同步模式位(SRGR2的FSGM位)决定帧同步信号 接收帧同步模式位 FSRM=0时,帧同步信号由外部器件驱动,FSR为输入引脚 FSRM=1时,片内采样率发生器产生帧同步信号,FSR为输出引脚(除非SRGR的 GSYNC=1) 发送器时钟模式位 CLKXM=0时,发送器时钟由外部时钟驱动,CLKX为外部时钟输入引脚 CLKXM=1时,CLKX为输出引脚,并且由内部采样率发生器驱动 在SPI模式下(当CLKSTP为非0值): CLKXM=0时,McBSP为从器件,并且时钟(CLKX)由系统的SPI主器件驱动。CLKR由内 部CLKX驱动;CLKXM=1,McBSP为主器件,并产生时钟(CLKX)去驱动它的接收时钟 (CLKR)和系统的SPI从器件的移位时钟
DSP中用MCBSP口与PC机用RS232串口通信
hMcbspFrontPanel = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET); MCBSP_config(hMcbspFrontPanel, &mcbFrontPanel);//初始化状态下,对各个寄存器的配置
MCBSP_start(hMcbspFrontPanel,MCBSP_RCV_START | MCBSP_XMIT_START | MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,0x3000u); }
MCBSP_XCR_RMK( MCBSP_XCR_XPHASE_SINGLE, MCBSP_XCR_XFRLEN2_DEFAULT, MCBSP_XCR_XWDLEN2_DEFAULT, MCBSP_XCR_XCOMPAND_MSB, MCBSP_XCR_XFIG_YES, MCBSP_XCR_XDATDLY_1BIT, MCBSP_XCR_XFRLEN1_OF(9), MCBSP_XCR_XWDLEN1_24BIT, //一个帧中有10个字 //一个字中有24bit //单相位
MCBSP_SPCR_RMK( MCBSP_SPCR_FREE_DEFAULT, MCBSP_SPCR_SOFT_DEFAULT, MCBSP_SPCR_FRST_DEFAULT, MCBSP_SPCR_GRST_YES, MCBSP_SPCR_XINTM_XRDY, //MCBSP_SPCR_XSYNCERR_DEFAULT, MCBSP_SPCR_XRDY_NO, MCBSP_SPCR_XRST_YES, MCBSP_SPCR_DLB_OFF, MCBSP_SPCR_RJUST_RZF, MCBSP_SPCR_CLKSTP_DISABLE, MCBSP_SPCR_DXENA_OFF, MCBSP_SPCR_RINTM_RRDY, //MCBSP_SPCR_RSYNCERR_DEFAULT, MCBSP_SPCR_RRDY_NO, //接收准备好置位时产生接收中断 //取消时钟停等模式 //发送准备好当数据写进DXR时 //发送使能,复位状态 //采样率发生器复位状态 //发送准备好置位时 产生发送中断
DSP实验手册 实验五 同步串口实验
实验五同步串口实验一. 验目的:1.悉CCS的开发环坏境;2.了解DSP的MCBSP外设的使用;3.熟悉C语言的宏函数在MCBSP设置中的使用情况;二. 实验内容:1. DSP的初始化;2. UART的初始化;3. MCBSP的初始化设置;4. MCBSP的发送;5. MCBSP的接收;三. 实验背景知识:1. McBSPMCBSP是DSP的片上外设资源。
它可以与其它的DSP、CODEC和带有SPI 接口的器件进行连接。
在TMS320VC5416上共有3个MCBSP(Multichannel Buffered Serial Port)。
它共有三组主个管脚,包含了数据通路与控制通路。
其内部原理图如下:注:CLKS在C5000系列的DSP中没有提供,只在C6000中才有支持。
2.串行同步通信的信号:FSR、CLKR、DR和FSX、CLKX、DX帧同步信号:FSR、FSX位-时钟:CLKR、CLKX串行数据流:DR、DX3.串行同步串行通信协议:1) 串行数据流起始时刻称为帧同步事件。
帧同步事件由位-时钟采样帧同步信号给出。
2) 串行数据流长度:串行传输的数据流位数达到设定的长度后,结束本次传输,等下一个帧同步信号达到,再发起另一次串行传输。
3) 串行数据流传输速度:即每一个串行位的持续时间,由位-时钟决定4) FSR(FSX)、CLKR(CLKX)、DR(DX)三者之间的关系即如何取得帧同步事件、何时采样串行数据位流、或何时输出串行数据位流,是可以通过MCBSP的寄存器进行配置的。
其寄存器的列表如下:其中SPCR1x后面的寄存器是二次寻址的,其过程如下:首先向SPSAx寄存器中写入你想要操作的寄存器的子地址,然后再向SPSDx中写入你想要的数据,从而完成对其的操作。
4.同步串口实验中使用MCBSP1作为与SEED-MMI5402通讯的同步串口其连接图如下:5.在同步串口实验中,,并而将MCBSP1设置成为单通道的方式使用。
DSP28335 MCBSP调试程序
DSP28335 MCBSP调试程序源码本程序使用MCBSPB,GPIO24,GPIO25,GPIO26,GPIO60。
时钟停止模式,发送时钟内部输出,接收时钟外部提供。
中断接收。
8位数据。
测试时,可短接收发输出IO和收发时钟IO。
void InitMcbsp(void){//InitMcbspa();//#if DSP28_MCBSPBInitMcbspbGpio();InitMcbspb_DMA();//#endif // end DSP28_MCBSPB}void InitMcbspb_DMA(void)//MSP初始化{McbspbRegs.SPCR2.all=0x0000; // Reset FS generator, sample rate generator & transmitterMcbspbRegs.SPCR1.all=0x0000; // Reset Receiver, Right justify word McbspbRegs.MFFINT.all=0x0; // Disable all interruptsMcbspbRegs.SPCR1.bit.DLB = 0; // Enable DLB mode. Comment out for non-DLB mode.是否内部连接DX与DRMcbspbRegs.SPCR1.bit.CLKSTP = 2; //使能时钟停止模式McbspbRegs.RCR2.all=0x0; // Single-phase frame, 1 word/frame, No companding (Receive)McbspbRegs.RCR1.all=0x0;McbspbRegs.XCR2.all=0x0; // Single-phase frame, 1 word/frame, No companding (Transmit)McbspbRegs.XCR1.all=0x0;McbspbRegs.PCR.bit.FSXM = 1; // FSX generated internally, FSR derived from an external sourceMcbspbRegs.PCR.bit.FSRM = 1;McbspbRegs.PCR.bit.CLKXM = 1; // CLKX generated internally, CLKR derived from an external sourceMcbspbRegs.PCR.bit.CLKRM = 0; //输入时钟由外部时钟驱动McbspbRegs.SRGR2.bit.CLKSM = 1; // CLKSM=1 (If SCLKME=0, i/pclock to SRG is LSPCLK),=1表示MCBSP时钟由CPU提供McbspbRegs.SRGR2.bit.FPER = 15; // FPER = 32 CLKG periods,帧同步信号间隔McbspbRegs.SRGR1.bit.FWID = 0; // Frame Width = 1 CLKG period,帧同步脉冲宽度McbspbRegs.SRGR1.bit.CLKGDV = 149; // CLKG frequency =LSPCLK/(CLKGDV+1),时钟设置,LSPCLK=37.5MHZMcbspbRegs.SRGR2.bit.FSGM = 0;// Initialize McBSP Data LengthInitMcbspb8bit();McbspbRegs.MFFINT.bit.XINT = 0; // Enable Transmit InterruptsMcbspbRegs.MFFINT.bit.RINT = 1; // Enable Receive Interrupts//McbspbRegs.DXR1.all=0;//Enable Sample rate generatorMcbspbRegs.SPCR2.bit.GRST=1; // 采样率时钟发生器复位停止delay_loop(); // Wait at least 2 SRG clock cyclesMcbspbRegs.SPCR2.bit.XRST=1; // Release TX from ResetMcbspbRegs.SPCR1.bit.RRST=1; // Release RX from Resetdelay_loop();McbspbRegs.SPCR2.bit.FRST=1; // Frame Sync Generator reset}void InitMcbspb8bit(void){McbspbRegs.RCR1.bit.RWDLEN1=0; // 8-bit wordMcbspbRegs.XCR1.bit.XWDLEN1=0; // 8-bit word}void InitMcbspbGpio(void){EALLOW;/* Configure McBSP-A pins using GPIO regs*/// This specifies which of the possible GPIO pins will be McBSP functional pins.// Comment out other unwanted lines.//GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 3; // GPIO12 is MDXB pin (Comment as needed)GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3; // GPIO24 is MDXB pin (Comment as needed)//GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 3; // GPIO13 is MDRB pin (Comment as needed)GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3; // GPIO25 is MDRB pin (Comment as needed)//GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 3; // GPIO14 is MCLKXB pin (Comment as needed)GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 3; // GPIO26 is MCLKXB pin (Comment as needed)//GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 3; // GPIO3 is MCLKRB pin (Comment as needed)GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 1; // GPIO60 is MCLKRB pin (Comment as needed)//GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 3; // GPIO15 is MFSXB pin (Comment as needed)GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 3; // GPIO27 is MFSXB pin (Comment as needed)//GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 3; // GPIO1 is MFSRB pin (Comment as needed)GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 1; // GPIO61 is MFSRB pin (Comment as needed)/* Enable internal pull-up for the selected pins */// Pull-ups can be enabled or disabled by the user.// This will enable the pullups for the specified pins.// Comment out other unwanted lines.GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0; // Enable pull-up on GPIO24 (MDXB) (Comment as needed)//GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; // Enable pull-up on GPIO12 (MDXB) (Comment as needed)GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0; // Enable pull-up on GPIO25 (MDRB) (Comment as needed)//GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0; // Enable pull-up on GPIO13 (MDRB) (Comment as needed)GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0; // Enable pull-up on GPIO26 (MCLKXB) (Comment as needed)//GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0; // Enable pull-up on GPIO14 (MCLKXB) (Comment as needed)//GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; // Enable pull-up on GPIO3 (MCLKRB) (Comment as needed)GpioCtrlRegs.GPBPUD.bit.GPIO60 = 1; // Enable pull-up on GPIO60 (MCLKRB) (Comment as needed)GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0; // Enable pull-up on GPIO27 (MFSXB) (Comment as needed)//GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0; // Enable pull-up on GPIO15(MFSXB) (Comment as needed)//GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Enable pull-up on GPIO1 (MFSRB) (Comment as needed)GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0; // Enable pull-up on GPIO61 (MFSRB) (Comment as needed)/* Set qualification for selected pins to asynch only */// This will select asynch (no qualification) for the selected pins.// Comment out other unwanted lines.GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3; // Asynch input GPIO24 (MDXB) (Comment as needed)//GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 3; // Asynch input GPIO12 (MDXB) (Comment as needed)GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3; // Asynch input GPIO25 (MDRB) (Comment as needed)//GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 3; // Asynch input GPIO13 (MDRB) (Comment as needed)GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3; // Asynch input GPIO26(MCLKXB) (Comment as needed)//GpioCtrlRegs.GPAQSEL1.bit.GPIO14 = 3; // Asynch input GPIO14 (MCLKXB) (Comment as needed)//GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3; // Asynch input GPIO3 (MCLKRB) (Comment as needed)GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO60 (MCLKRB) (Comment as needed)GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3; // Asynch input GPIO27 (MFSXB) (Comment as needed)//GpioCtrlRegs.GPAQSEL1.bit.GPIO15 = 3; // Asynch input GPIO15 (MFSXB) (Comment as needed)//GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 3; // Asynch input GPIO1 (MFSRB) (Comment as needed)GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO61 (MFSRB) (Comment as needed)EDIS;}void McBSPB_TXdata(Uint16 *data,Uint16 number){Uint16 i=0;for(i=0;i<number;i++){McbspbRegs.DXR1.all=data[i] & 0x00FF;while(!McbspbRegs.SPCR2.bit.XRDY);}}void delay_loop(void){long i;for (i = 0; i < MCBSP_INIT_DELAY; i++) {} //delay in McBsp init. must be at least 2 SRG cycles}void clkg_delay_loop(void){long i;for (i = 0; i < MCBSP_CLKG_DELAY; i++) {} //delay in McBsp init. must be at least 2 SRG cycles}Main函数初始化void main(void){InitSysCtrl(); //初始化系统控制asm(" RPT #8 || NOP"); //正常情况下占用N+1个时钟周期DINT; //屏蔽全局中断InitPieCtrl(); //初始化PIE控制器IER = 0x0000;IFR = 0x0000; //InitPieVectTable(); //初始化PIE中断向量表asm(" RPT #8 || NOP");//InitCpuTimers();//ConfigCpuTimer(&CpuTimer0, 150, 10000); //0.01s//InitGpio();//InitAdc();//InitI2C();//StartDMACH1();//StartDMACH2();InitMcbsp();//InitXintf();//InitScic();EALLOW;PieVectTable.TINT0 = &cpu_timer0_isr;//PieVectTable.EPWM1_INT = &epwm1_isr;//PieVectTable.XINT1 = &ADCINT_ISR; //进行数据采集//PieVectTable.SPIRXINTA=&SPIRXINTA_ISR;//PieVectTable.SCIRXINTC=&SCIRXINTB_ISR;PieVectTable.MRINTB= &MRINTB_ISR;//PieVectTable.MXINTB= &MXINTB_ISR;//PieVectTable.MRINTA= &MRINTA_ISR;//PieVectTable.MXINTA= &MXINTA_ISR;PieVectTable.DINTCH1= &DINTCH1_ISR;//DMAPieVectTable.DINTCH2= &DINTCH2_ISR;//DMAEDIS;PieCtrlRegs.PIECTRL.bit.ENPIE = 1;PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //开CPU定时器中断//PieCtrlRegs.PIEIER1.bit.INTx4 = 1; //AD7606中断//PieCtrlRegs.PIEIER3.bit.INTx1 = 1; ////PieCtrlRegs.PIEIER6.bit.INTx1 = 0; //SPI接收中断//PieCtrlRegs.PIEIER8.bit.INTx5 = 0; //SCI接收中断PieCtrlRegs.PIEIER6.bit.INTx3=1; // Enable PIE Group 6, INT 3PieCtrlRegs.PIEIER6.bit.INTx4=1; // Enable PIE Group 6, INT 4PieCtrlRegs.PIEIER6.bit.INTx5=1; // Enable PIE Group 6, INT 5PieCtrlRegs.PIEIER6.bit.INTx6=1; // Enable PIE Group 6, INT 6PieCtrlRegs.PIEIER7.bit.INTx1=1; // Enable PIE Group 7, INT 1 (DMA CH1)PieCtrlRegs.PIEIER7.bit.INTx2=1; // Enable PIE Group 7, INT 2 (DMA CH2)IER |= (M_INT1 | M_INT3 | M_INT6 | M_INT7);EINT; // Enable Global interrupt INTMERTM; // Enable Global realtime interrupt DBGM。
基于McBSP实现DSPs与串行AD_DA的接口设计
第30卷第5期2009年5月微 计 算 机 应 用M I CROCOMP UTER APP L I CATI O NSVol130No15M ay12009基于M c BSP实现D SPs与串行AD/DA的接口设计杨 雪 牟燕妮(北京强度环境研究所 北京 100076)摘要:重点介绍了利用DSPs的多通道缓冲串口Mc BSP实现与A/D、D/A串行接口的设计。
TI公司T MS320C67x系列DSPs的Mc BSP有两种配置方式,一种是配置成串口的模式,一种是配置成通用I/O的模式,本文分别用这两种模式进行了A/D和D/ A接口的设计,其硬件及软件的实现方法简单、方便,可节省程序代码空间和CP U运行时间。
关键词:M cBSP T M S320C67x A/D D/AI n terface D esi gn between the D S PCh i Pand Ser i a l AD/DA Ba sed on M c BSPY ANG Xue,MU Yanni(Beijing I nstitute of Strength and Envir on ment Engineering,Beijing,100076,China)Abstract:This paper p resents the interface design bet w een M c BS Pand A/D、D/A.There are t w o M c BS Pconfigurati on:one is con2 figured as serial model;The other is configured as common I/O model.I n this paper,these t w o models were used t o carry out the A/D and D/A interface design.Its hard ware circuit and s oft w are p r ogra mm ing are si m p le,s o it can econom ize p r ogra m code s pace and CP U running ti m e.Keyword:Mc BSP,T M S320C67x,A/D,D/A随着数字化的飞速发展,数字信号处理已经成为一个核心的概念。
基于DSP的McBSP串口操作源程序(汇编语言)
McBSP串口操作源程序;----------------------------------------------------------------; This program use McBSP1 sent SINE table.The table is in VC5402'; ROM.So, the program move the talbe to xbuffer first, then send; them from McBSP1.The rbuffer use to save recived data !;----------------------------------------------------------------.title "for test BSP program (Transmit) ".mmregs.global _c_int00,int_send,int_rev;----------define serial control registers' address--------DRR10 .set 0x0021 ; McBSP0 data receive register 1 DRR11 .set 0x0041 ; McBSP1 data receive register 1 DRR12 .set 0x0031 ; McBSP2 data receive register 1 DXR10 .set 0x0023 ; McBSP0 data transmit register 1 DXR11 .set 0x0043 ; McBSP1 data transmit register 1 DXR12 .set 0x0033 ; McBSP2 data transmit register 1 MCBSP0_SPSA .set 0x0038MCBSP0_SPSD .set 0x0039MCBSP1_SPSA .set 0x0048 ; serial 1MCBSP1_SPSD .set 0x0049 ; serial 1MCBSP2_SPSA .set 0x0034MCBSP2_SPSD .set 0x0035MCBSP_SPCR1_SUB_ADDR .set 0x0000MCBSP_SPCR2_SUB_ADDR .set 0x0001MCBSP_RCR1_SUB_ADDR .set 0x0002MCBSP_RCR2_SUB_ADDR .set 0x0003MCBSP_XCR1_SUB_ADDR .set 0x0004MCBSP_XCR2_SUB_ADDR .set 0x0005MCBSP_SRGR1_SUB_ADDR .set 0x0006MCBSP_SRGR2_SUB_ADDR .set 0x0007MCBSP_MCR1_SUB_ADDR .set 0x0008MCBSP_MCR2_SUB_ADDR .set 0x0009MCBSP_RCERA_SUB_ADDR .set 0x000aMCBSP_RCERB_SUB_ADDR .set 0x000bMCBSP_XCERA1_SUB_ADDR .set 0x000cMCBSP_XCERA2_SUB_ADDR .set 0x000dMCBSP_PCR_SUB_ADDR .set 0x000estack_size .set 100htemp .usect ".var",1 ; temp is in 60h-7fh, dp=0;send_ptr .usect ".var",1 ; save sent buf ptrrev_ptr .usect ".var",1 ; save rev buf ptrisnew .usect ".var",1 ;xbuffer .usect ".xbuf",256rbuffer .usect ".rbuf",256.bss addr_stack,stack_size.text_c_int00:ssbx intm ; disable all interrupt !stm #2028h,PMST ; vector in 2000hstm #addr_stack+stack_size,sp ; init SPstm #0c00h,IMR ; enable serial_1 sendstm #xbuffer,ar0rpt #255mvpd #0fe00h,*ar0+ ; move sine tabel to xbuffer !stm #rbuffer,ar0rpt #255st #0,*ar0+ ; clear rev_buffer to 0stm #xbuffer,send_ptrstm #rbuffer,rev_ptrstm #256,bk ; circular buffer size=256;******************************************************************; The following codes are used to initalize McBSP1 !; When Transmit, this DES5402PP makes CLK,FS ! the other; DES5402PP receives the CLK,FS !;****************************************************************** stm #0,MCBSP1_SPSA ; choose SPCR11stm #2000h,MCBSP1_SPSD ; receive sign_extend in DRRstm #1,MCBSP1_SPSA ; choose SPCR20stm #100h,MCBSP1_SPSD ;stm #2,MCBSP1_SPSA ; choose RCR10stm #40h,MCBSP1_SPSD ; 16 bits each wordstm #3,MCBSP1_SPSA ; choose RCR20stm #40h,MCBSP1_SPSDstm #4,MCBSP1_SPSA ; choose XCR10stm #40h,MCBSP1_SPSD ; 16 bits each wordstm #5,MCBSP1_SPSA ; choose XCR20stm #0,MCBSP1_SPSDstm #6,MCBSP1_SPSA ; choose SRGR1stm #1C8h,MCBSP1_SPSD ; CLKG=100M /200=500Kstm #7,MCBSP1_SPSA ; choose SRGR2stm #2000h,MCBSP1_SPSD ; Sample rate generator clock derived from CPU clock; 0x8,0x9,0xa,0xb,0xc,0xd all = 0x0stm #0eh,MCBSP1_SPSA ; choose PCR0stm #0a0eh,MCBSP1_SPSDrpt #0ffhnopstm #0h,MCBSP1_SPSAstm #2001h,MCBSP1_SPSD ; enable recive !stm #1,MCBSP1_SPSAstm #1c1h,MCBSP1_SPSD ; enable transmit !stm #0,DXR11;------ init serial port 1 end -----------------------------rsbx intm ; enable all int,again:nopnopb againnop;-------------------------------------------------------------; interrupt for INT_BXINT !;-------------------------------------------------------------int_send:pshm st0pshm st1pshm ar2ld #0,dpmvdk send_ptr,ar2 ; restore send ptr !mvdk *ar2+%, DXR11 ; send data to serial portnopnopmvmd ar2,#send_ptr ; save send ptr !popm ar2popm st1popm st0rete;-------------------------------------------------------------; interrupt for INT_BRINT !;-------------------------------------------------------------int_rev:pshm st0pshm st1pshm ar2ld #0,dpmvdk rev_ptr,ar2 ; restore rev ptr !ld DRR11,astl a,-1,*ar2+% ; save data to rev_buf; nop; nopmvmd ar2,#rev_ptr ; save rev ptr !cmpm ar2,#0400hbc con,ntcnop ; set breakpoint here !nop ; show wave in 0x200 and 0x400con:popm ar2popm st1popm st0rete.end中断向量文件vectors.asm:.sect ".vectors".ref _c_int00 ; C entry point.global int_send,int_rev.align 0x80 ; must be aligned on page boundary RESET: ; reset vectorB _c_int00 ; branch toC entry pointnopnopnmi: RETE ; enable interrupts and return from oneNOPNOPNOP ; software interruptssint17 .space 4*16sint18 .space 4*16sint19 .space 4*16sint20 .space 4*16sint21 .space 4*16sint22 .space 4*16sint23 .space 4*16sint24 .space 4*16sint25 .space 4*16sint26 .space 4*16sint27 .space 4*16sint28 .space 4*16sint29 .space 4*16sint30 .space 4*16int0: RETENOPNOPNOPint1: RETENOPNOPNOPint2: RETENOPNOPNOPtint0: RETENOPNOPNOPrint0: RETENOPNOPNOPxint0: RETENOPNOPNOPdmac0: RETENOPNOPNOPtint1: RETENOPNOPNOPint3: RETENOPNOPNOPhpint: RETENOPNOPNOPrint1: b int_revNOPNOPxint1: b int_sendNOPNOP.end链接命令文件:MEMORY{PAGE 0: EPROG: origin = 0x2080, len = 0x1f80 VECT: origin = 0x2000, len = 0x80 PAGE 1: USERREGS: origin = 0x60, len = 0x1c BIOSREGS: origin = 0x7c, len = 0x4IDA TA: origin = 0x80, len = 0x1f80EDATA: origin = 0x2000, len = 0x8000 }SECTIONS{.vectors: {} > VECT PAGE 0.sysregs: {} > BIOSREGS PAGE 1.trcinit: {} > EPROG PAGE 0.gblinit: {} > EPROG PAGE 0.bios: {} > EPROG PAGE 0frt: {} > EPROG PAGE 0.text: {} > EPROG PAGE 0.cinit: {} > EPROG PAGE 0.pinit: {} > EPROG PAGE 0.sysinit: {} > EPROG PAGE 0.bss: {} > IDA TA PAGE 1.far: {} > IDA TA PAGE 1.const: {} > IDATA PAGE 1.switch: {} > IDATA PAGE 1.sysmem: {} > IDATA PAGE 1.cio: {} > IDA TA PAGE 1.MEM$obj: {} > IDA TA PAGE 1.sysheap: {} > IDATA PAGE 1.xbuf align(512): {} > IDATA PAGE 1 .rbuf align(512): {} > IDA TA PAGE 1 .var {} > USERREGS PAGE。
mcbsp模拟串口详细设置含起始位停止位
#define Mcbsp1Xmit 14//Mcbsp1发送事件
#define Mcbsp1Rcv 15//Mcbsp1接收事件
#define Mcbsp2Xmit 17//Mcbsp2发送事件
#define Mcbsp2Rcv 18//Mcbsp2接收事件
else if (cnt == 8)//停止位
*xmitbufptr++=0xFFFF;
else if (xmit_char & (1 << cnt))//数据位
*xmitbufptr++=0xFFFF;
else
*xmitbufptr++=0x0000;
}//end for cnt
/*-------------------------------------------------------------*/
{
inti;
Uint8 recv_char=0;
shortcnt=-1;
shortrecv_val;
unsignedshortraw_data;
unsignedshort*recvbufptr;//receive buffer pointer
intreceive_check_sum;
intCheck_sum;
接收时还应根据通信协议的内容修改my_uart.c文件中函数
void ConfigEDMArx(EDMA_Handle hEdma,Uint32 mcbspRcvAddr)中的相关内容
/* CNT Setup */
EDMA_CNT_RMK(0, (BUFFER_SIZE *10)),//本例中10表示1个起始位,8个数据位,1个停止位
基于DSP实验系统的串口通信
课程设计报告( 2014 -- 2015年度第二学期)课程名称:DSP课程设计题目:基于DSP实验系统的串口通信院系:电子与通信工程系班级:电子学号:学生姓名:指导教师:设计周数: 2成绩:日期:2015 年7月16日一、课程设计的目的与要求1.设计方案:通过TMS320C5509A的串口与电脑进行通信,利用串口调试助手发送数据,由DSP接收到,DSP读到收到数据进行下一步的让四位LED灯亮,实现数据的通信,并在lcd12864上显示发送的数据,还有显示拨码开关的数值。
2.设计指标:电脑只能发送0~15,因为读出数据的时候比较方便解码,比如发送4就可以直接给LED直接赋值,让第三个灯亮,也就是一般的二进制转换。
二、设计正文1.设计思路(系统组成介绍)串口模块:TL16C550 是一个标准的串口接口芯片,它的控制寄存器基地址为0x400200,寄存器占用TMS320VC5509 的8 个地址单元。
串口中断与TMS320VC5509 的INT0 连接。
用户可以使用TMS320VC5509 的中断0 响应串口中断。
TL16C550 有11 个寄存器,这11 个寄存器是通过TMS320VC5509 的3 个地址线(A3~A1)和线路控制寄存器中的DLAB 位对它们进行寻址的。
板上加上16C550、Max232 和驱动电路。
驱动电路主要完成将输出的0-3.3V 电平转换成异步串口的工作电平,转换电平的工作由MAX232 芯片完成,但由于它是5V 器件,所以它同DSP 间的信号线必须有电平转换,此板采用的是74LVC245。
实验箱上的液晶模块采用的型号是TJDM12864MTJDM12864M 是一款带中文字库的图形点阵模块,由动态驱动方式驱动128×64 点阵显示。
低功耗,供应电电压范围宽。
内含多功能的指令集,操作简易。
采用COB 工艺制作,结构稳固,使用寿命长。
特性:1.提供 8 位,4 位及串行接口可选2.64×16 位字符显示 RAM(DDRAM 最多 16 字符×4 行,LCD 显示范围 16×2 行)3.2M 位中文字型 ROM(CGROM),总共提供 8192 个中文字型(16×16 点阵)4.16K 位半宽字型 ROM(HCGROM),总共提供 126 个西文字型(16×8 点阵)5.64×16 位字符产生 RAM(CGRAM)6.15×16 位总共 240 点的 ICON RAM(ICONRAM)7.自动复位(RESET)功能8.绘图及文字画面混合显示功能9.提供多功能指令:——画面清除(display clear)——游标归位(return home)——显示开/关(display on/off)——游标显示/隐藏(cursor on/off)——字符闪烁(display character blink)——游标移位(cursor shift)——显示移位(display shift)——垂直画面旋转(vertical line scoll)——反白显示(By-line reverse display)——睡眠模式(sleep mode)DSP与LCD的连接:3.软件设计流程:4.在试验箱上模拟实现用随实验箱附带的串口线(两端均为9 孔“D”形插头)连接计算机com1 或com2 插座和ICETEK–VC5509-A 板上标准RS-232 插座,编译、下载、运行。
基于McBSP实现DSP与串行Flash之间的接口通讯
基于McBSP实现DSP与串行Flash之间的接口通讯
孟勃;朱明
【期刊名称】《电子器件》
【年(卷),期】2006(029)003
【摘要】利用多通道缓冲串口McBSP0实现了TMS320VC5509 DSP与外部串行Flash之间的SPI通讯.完成了用DSP控制Flash进行在线系统编程.有效地降低了系统设计的复杂性,节省了空间.重点介绍了McBSP与Flash之间串行接口的设计,并介绍了TMS320VC5509串行8位引导装载的实现方法.同时给出用CSL库函数实现McBSP配置的程序.
【总页数】5页(P920-924)
【作者】孟勃;朱明
【作者单位】中国科学院,研究生院,北京,100039;中国科学院,长春光学精密机械与物理研究所,长春,130033;中国科学院,长春光学精密机械与物理研究所,长
春,130033
【正文语种】中文
【中图分类】TN91
【相关文献】
1.基于McBSPs实现TMS320C6000系列DSPs异步串行通信 [J], 商丹;高永清;陈义平
2.DSP同步串行口和PC机之间异步通讯的实现方法 [J], 徐彦峰;徐睿
3.C6000与C2000系列DSP之间串行数据通讯的研究与实现 [J], 韩开亮;张涛
4.TMS320C54XX系列DSP的McBSP串行接口技术及应用 [J], 马庆春;迟宝全
5.基于McBSP实现DSPs与串行AD/DA的接口设计 [J], 杨雪;牟燕妮
因版权原因,仅展示原文概要,查看原文内容请购买。
dsp原理及应用-第6章-C语言和汇编语言混合编程
C语言和汇编语言的结合方式
内联汇编
将汇编语言代码与C语言代 码混编。
汇编语言函数
将汇编语言封装为函数, 用C语言调用。
C语言函数
将C语言封装为函数,在函 数中调用汇编语言子程序。
实例演示:C语言和汇编语言混合编程
1
C语言部分
通过C语言编写程序框架,并进行数据处理等高级任务。
2
汇编语言部分
通过汇编语言实现一些需要底层控制或高性能的部分。
3
代码整合
将C语言和汇编语言的代码整合到一起。
总结和要点
混合编程优点
• 可读性高 • 可维护性高 • 可扩展性强
结合方式
• 内联汇编 • 汇编语言函数 • C语言函数
基本原则
• 注释清晰 • 适当使用内联ห้องสมุดไป่ตู้编 • 预先规划好程序结构
汇编语言是一种低级计算机语言,是计算机指令的助记符。它可以直接操作硬件,能够完成 一些高级语言所不能完成的功能。
混合编程
把C语言和汇编语言结合起来,可以充分利用C语言的高级语言特性,同时也能利用汇编语 言的底层控制能力来处理一些需要精细控制的任务。
为什么需要混合编程
1 提高性能
当C语言性能不能满足需求时,可以使用汇编语言来进行优化,提高程序性能。
2 底层控制
在一些需要底层控制的任务中,汇编语言更为方便和直接。
3 扩展C语言能力
使用汇编语言,可以扩展C语言的能力,实现一些高级语言所不能实现的功能。
混合编程的优点
1
可读性
使用C语言编写程序的可读性很高,而且汇编语言部分可以通过注释来解释各个 部分的作用。
2
可维护性
大多数程序员都能够读懂C语言,并根据需要做出修改,这样也更容易实现程序 的维护。
DSP系统中C语言和汇编语言的混合编程
2
C语言和汇编语言的混合编程 C语言的存储器模型
1 C语言的存储器模型
C编译器产生的段
段名称 .text 已初 始化 段 .cinit .switch .const .bss 未初 始化 段 .stack .system 段内容 可执行代码和浮点常数 已初始化的全局变量和静态变量 的列表 用于多开关语句的跳转列表 已初始化的字符串、全局常量和 静态常量 全局和静态变量 软件堆栈 动态存储空间 存储器类型 ROM或RAM ROM或RAM ROM或RAM ROM或RAM RAM RAM RAM 页 0 0 0 1 1 1 1
独立的C和汇编模块接口
在编写汇编语言时必须遵循有关的寄存器规则和调用规 则,否则可能会破坏C的运行环境 在编写独立的汇编程序时,必须注意以下几点:
无论是C函数还是汇编函数,都必须遵循寄存器使用规则 必须保护函数要用到的几个专用寄存器,专用寄存器包括: AR0(FP)、AR1(SP)、AR6和AR7;其中,如果SP正 常使用的话,则不必明确加以保护,即只要汇编函数在返回 时弹出压入的对象,实际上就已经保护了SP 其它寄存器可以自由使用
18
C语言和汇编语言的混合编程 C语言与汇编语言的接口
2
19
C语言和汇编语言的混合编程 C语言与汇编语言的接口
在汇编语言中访问C程序变量
在C程序中定义全局变量 在汇编语言中使用.global声明为外部变量,变量名前加 下划线“_” 在汇编程序中正常地对变量访问
20
C语言和汇编语言的混合编程 C语言与汇编语言的接口
寄存器 AR0 AR1 AR2 AR2~AR5 AR6~AR7 ACC累加器 P T 结构指针 堆栈指针 局部变量指针 表达式分析 寄存器变量 表达式分析/返回值 表达式分析 表达式分析 用处 被调函数保护 Yes Yes No No Yes No No No
利用DSP的McBSP实现与PC机串行通信
0 ! 硬件接口电路设计
’$ 机 通 常 有 两 个 可 编 程 的 ;G%1, 分别是 $&"- 和 $&"0 。它们的接口通信标准通常是 %) 8 020$ , %) 8 020$ 对逻辑电平作了如下规定: 在 1X*
作者简介: 陆志洋 ( -699 8 ) , 男, 安徽贵池人, 硕士研究生, 主研 收稿日期: 0//3 8 /3 8 -.
/ ! 引! 言
数字信号处理器 ( *)’) 因其强大的数据处理能 力已在通信和信号处理、 信号与信息处理、 自动控制 等领域得到越来越广泛的应用。尤其象美国 1# 公 司的 1")20/$34X 系列, 更 具有通用性。经过 *)’ 处理后的 数据通常 要送到 ’$ 机进行 显示或 监控 等。但 1")20/$34X 只具有同步串口, 而通常 ’$ 机 都是 通 用 异 步 串 行 接 口 ( ;G%1 ) 。目前常用的 1")20/$34X 系列 *)’ 与 ’$ 机进行串行通信的方 式要么在软件编程上过于烦琐, 使通信速率慢; 要么 在硬件设计上过于复杂, 增大系统的体积。在利用 1")20/$34/0 ( 简称 $34/0 ) 进行抗噪声对消系统的 设计时, 为了在软件和硬件不过于复杂化的情况下 实现该系统与上位机 ( 这里即为 ’$ 机) 进行数据信 息的交换, 我们设计了一种利用 $34/0 的 "+,)’ 与 ’$ 机进行异步串行通信的方案。这种方案能够实 现 $34/0 与 ’$ 机之间的高速全双工通信。
和 %X* 上, 逻辑 ( "G%Y)Z 8 2[ \ 8 -3[, 逻辑 / ( )’G$()Z ] 2 \ ] -3[。而 $34/0 的 # ^ & 电平是: 逻辑 - 或无信号 Z 27 2[, 逻辑 / Z /[。为了使它们 相互通信, 必须通过 "G_020 芯片进行 电平转换。 但由于 "G_020 供给电平为 3[ , 故采用两串联电阻 进行分压以达到与 $34/0 的接收电 平匹配。具 体 的硬件接口电路如图 - 所示。另外这里把 $34/0 的 数据接收线 *% 和接收帧同步 信号线 ‘)% 接在 一 起, 是利用一帧的起始位始终为低电平进行接收帧 同步触发的。但为了接收帧同步信号不受起始位后 面其他位 的干 扰, 必须将 "+,)’ 的 %$%0 寄存 器 %‘#a 位设置 为 - , 即 忽略第 一字以 后的 帧同步 信 号。
DSP28335 McBSP模块及寄存器中文资料
1McBSP简介1.1McBSP概述McBSP为多通道缓冲串口(Multichannel Buffered Serial Port)的简写,共有6个引脚,发送引脚MDX、接收引脚MDR、发送时钟信号引脚MCLKX、接收时钟信号引脚MCLKR、发送帧同步引脚MFSX和接收帧同步引脚MFSR。
28335有两个McBSP模块,对应引脚如下,1.2McBSP特点McBSP具有以下几个特点:1)全双工的通讯方式;2)通过两级缓冲发送和三级缓冲接收实现连续数据流的通信;3)独立的接收与发送的帧和时钟信号;4)可配置最多128个接收和发送通道;5)数据大小和范围可选,可配置为8、12、16、20、24、32位字长;6)数据传输时可选择高低位的发送顺序;7)可编程的内部时钟和帧发生器,可编程的帧同步和数据时钟极性;McBSP内部结构如下图所示:McBSP结构图1.3McBSP中断描述1.3.1接收中断1.3.2发送中断2DMA模块寄存器2.1.1控制寄存器1——SPCR1该寄存器设置McBSP串口的数字回环模式、接收字符拓展和校验模式、ClockStop模式、DX是否允许、A-bis模式、接收中断模式等,并给很粗接受同步错误、接收移位寄存器空、接收就绪等状态位,此外该可以接收复位。
2.1.2控制寄存器2——SPCR2SPCR2设置了McBSP自由运行模式、SOFT模式、发送中断模式,并给出发送同步错误、发送移位寄存器空、发送准备好等状态位,此外还可进行发送复位、采样率发生器复位、帧同步发生电路复位。
表FREE、SOFT设置2.1.3引脚控制寄存器PCRPCR设置McBSP传输帧同步模式、接收帧同步模式、发送时钟模式、接收时钟模式、发送帧同步信号的极性、接收帧同步信号的极性、发送时钟极性、接收时钟极性,并给出CLKS、DX、DR引脚的状态。
此外PCR还定义发送和接收部分在复位时相应引脚引脚是否配置为通用I/O;2.1.4接收控制寄存器RCR1RCR1设置McBSP接收时第一相的接收帧长度(从1个字到128个字、接收字长度(8、12、16、20、24、32bits)。
DSP实验报告三:汇编语言程序和 CMD(链接控制)文件认识
实验三:汇编语言程序和 CMD(链接控制)文件认识一、实验目的:(1)学习用汇编语言编制程序。
(2)了解汇编语言程序下CCS使用它们时在设置上与C语言程序时的区别。
(3)学习编制命令文件控制代码的连接。
(4)学会建立和改变map文件,以及利用它观察DSP内存使用情况的方法。
(5)熟悉使用软件仿真方式调试程序。
二、实验仪器:安装 CCS3.1(CodeComposerStudioV3.1)的 PC 机。
三、实验内容:编译和修改源文件或命令文件,查看它们之间的联系。
四、实验步骤:(一).汇编语言程序连接器的设置1. 建立Lab02-UseCMD文件夹,设置保存路径在D:\中。
复制UseCMD.asm 和UseCMD.cmd到该文件夹中。
2. 启动CCS3.1并设置好仿真模式,按第1步的路径新建工程,并将这两个文件添加到工程中。
编译工程3.进入Build设置界面,点击Links,进入连接参数设置,Autoinit Mode下拉选择框中选择No Autoinitialization (非自动初始化)选项,在Code Entry Point (-e)框中填入汇编语言程序指定的入口点标号start。
设置完后的截图如下:(二).命令文件1.实验步骤如实验指导书。
2.运行结果如下:3.观察map文件如下:4.观察cmd文件如下:5.修改内存分配:修改 cmd 文件中的PRAM : o=100h,l=1f00h 改为 PRAM : o=200h,l=1e00h 重新编译工程,观察 map 文件中有何变化如下:五、实验心得:通过实验可以发现,修改 cmd 文件可以安排程序和数据在 DSP 内存资源中的分配和位置;map 文件中描述了程序和数据所占用的实际尺寸和地址。
实验程序中计算变量的取值之和,由于取值较小,所以结果仍为 16 位数,程序中仅考虑保存acc 的低 16位作为结果。
但如果计算中有进位等问题就需要考虑保存acc 的高16 位结果了。
DSP28335 MCBSP调试程序
DSP28335 MCBSP调试程序源码本程序使用MCBSPB,GPIO24,GPIO25,GPIO26,GPIO60。
时钟停止模式,发送时钟内部输出,接收时钟外部提供。
中断接收。
8位数据。
测试时,可短接收发输出IO和收发时钟IO。
void InitMcbsp(void){//InitMcbspa();//#if DSP28_MCBSPBInitMcbspbGpio();InitMcbspb_DMA();//#endif // end DSP28_MCBSPB}void InitMcbspb_DMA(void)//MSP初始化{McbspbRegs.SPCR2.all=0x0000; // Reset FS generator, sample rate generator & transmitterMcbspbRegs.SPCR1.all=0x0000; // Reset Receiver, Right justify word McbspbRegs.MFFINT.all=0x0; // Disable all interruptsMcbspbRegs.SPCR1.bit.DLB = 0; // Enable DLB mode. Comment out for non-DLB mode.是否内部连接DX与DRMcbspbRegs.SPCR1.bit.CLKSTP = 2; //使能时钟停止模式McbspbRegs.RCR2.all=0x0; // Single-phase frame, 1 word/frame, No companding (Receive)McbspbRegs.RCR1.all=0x0;McbspbRegs.XCR2.all=0x0; // Single-phase frame, 1 word/frame, No companding (Transmit)McbspbRegs.XCR1.all=0x0;McbspbRegs.PCR.bit.FSXM = 1; // FSX generated internally, FSR derived from an external sourceMcbspbRegs.PCR.bit.FSRM = 1;McbspbRegs.PCR.bit.CLKXM = 1; // CLKX generated internally, CLKR derived from an external sourceMcbspbRegs.PCR.bit.CLKRM = 0; //输入时钟由外部时钟驱动McbspbRegs.SRGR2.bit.CLKSM = 1; // CLKSM=1 (If SCLKME=0, i/pclock to SRG is LSPCLK),=1表示MCBSP时钟由CPU提供McbspbRegs.SRGR2.bit.FPER = 15; // FPER = 32 CLKG periods,帧同步信号间隔McbspbRegs.SRGR1.bit.FWID = 0; // Frame Width = 1 CLKG period,帧同步脉冲宽度McbspbRegs.SRGR1.bit.CLKGDV = 149; // CLKG frequency =LSPCLK/(CLKGDV+1),时钟设置,LSPCLK=37.5MHZMcbspbRegs.SRGR2.bit.FSGM = 0;// Initialize McBSP Data LengthInitMcbspb8bit();McbspbRegs.MFFINT.bit.XINT = 0; // Enable Transmit InterruptsMcbspbRegs.MFFINT.bit.RINT = 1; // Enable Receive Interrupts//McbspbRegs.DXR1.all=0;//Enable Sample rate generatorMcbspbRegs.SPCR2.bit.GRST=1; // 采样率时钟发生器复位停止delay_loop(); // Wait at least 2 SRG clock cyclesMcbspbRegs.SPCR2.bit.XRST=1; // Release TX from ResetMcbspbRegs.SPCR1.bit.RRST=1; // Release RX from Resetdelay_loop();McbspbRegs.SPCR2.bit.FRST=1; // Frame Sync Generator reset}void InitMcbspb8bit(void){McbspbRegs.RCR1.bit.RWDLEN1=0; // 8-bit wordMcbspbRegs.XCR1.bit.XWDLEN1=0; // 8-bit word}void InitMcbspbGpio(void){EALLOW;/* Configure McBSP-A pins using GPIO regs*/// This specifies which of the possible GPIO pins will be McBSP functional pins.// Comment out other unwanted lines.//GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 3; // GPIO12 is MDXB pin (Comment as needed)GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3; // GPIO24 is MDXB pin (Comment as needed)//GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 3; // GPIO13 is MDRB pin (Comment as needed)GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3; // GPIO25 is MDRB pin (Comment as needed)//GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 3; // GPIO14 is MCLKXB pin (Comment as needed)GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 3; // GPIO26 is MCLKXB pin (Comment as needed)//GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 3; // GPIO3 is MCLKRB pin (Comment as needed)GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 1; // GPIO60 is MCLKRB pin (Comment as needed)//GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 3; // GPIO15 is MFSXB pin (Comment as needed)GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 3; // GPIO27 is MFSXB pin (Comment as needed)//GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 3; // GPIO1 is MFSRB pin (Comment as needed)GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 1; // GPIO61 is MFSRB pin (Comment as needed)/* Enable internal pull-up for the selected pins */// Pull-ups can be enabled or disabled by the user.// This will enable the pullups for the specified pins.// Comment out other unwanted lines.GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0; // Enable pull-up on GPIO24 (MDXB) (Comment as needed)//GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; // Enable pull-up on GPIO12 (MDXB) (Comment as needed)GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0; // Enable pull-up on GPIO25 (MDRB) (Comment as needed)//GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0; // Enable pull-up on GPIO13 (MDRB) (Comment as needed)GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0; // Enable pull-up on GPIO26 (MCLKXB) (Comment as needed)//GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0; // Enable pull-up on GPIO14 (MCLKXB) (Comment as needed)//GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; // Enable pull-up on GPIO3 (MCLKRB) (Comment as needed)GpioCtrlRegs.GPBPUD.bit.GPIO60 = 1; // Enable pull-up on GPIO60 (MCLKRB) (Comment as needed)GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0; // Enable pull-up on GPIO27 (MFSXB) (Comment as needed)//GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0; // Enable pull-up on GPIO15(MFSXB) (Comment as needed)//GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Enable pull-up on GPIO1 (MFSRB) (Comment as needed)GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0; // Enable pull-up on GPIO61 (MFSRB) (Comment as needed)/* Set qualification for selected pins to asynch only */// This will select asynch (no qualification) for the selected pins.// Comment out other unwanted lines.GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3; // Asynch input GPIO24 (MDXB) (Comment as needed)//GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 3; // Asynch input GPIO12 (MDXB) (Comment as needed)GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3; // Asynch input GPIO25 (MDRB) (Comment as needed)//GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 3; // Asynch input GPIO13 (MDRB) (Comment as needed)GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3; // Asynch input GPIO26(MCLKXB) (Comment as needed)//GpioCtrlRegs.GPAQSEL1.bit.GPIO14 = 3; // Asynch input GPIO14 (MCLKXB) (Comment as needed)//GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3; // Asynch input GPIO3 (MCLKRB) (Comment as needed)GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO60 (MCLKRB) (Comment as needed)GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3; // Asynch input GPIO27 (MFSXB) (Comment as needed)//GpioCtrlRegs.GPAQSEL1.bit.GPIO15 = 3; // Asynch input GPIO15 (MFSXB) (Comment as needed)//GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 3; // Asynch input GPIO1 (MFSRB) (Comment as needed)GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO61 (MFSRB) (Comment as needed)EDIS;}void McBSPB_TXdata(Uint16 *data,Uint16 number){Uint16 i=0;for(i=0;i<number;i++){McbspbRegs.DXR1.all=data[i] & 0x00FF;while(!McbspbRegs.SPCR2.bit.XRDY);}}void delay_loop(void){long i;for (i = 0; i < MCBSP_INIT_DELAY; i++) {} //delay in McBsp init. must be at least 2 SRG cycles}void clkg_delay_loop(void){long i;for (i = 0; i < MCBSP_CLKG_DELAY; i++) {} //delay in McBsp init. must be at least 2 SRG cycles}Main函数初始化void main(void){InitSysCtrl(); //初始化系统控制asm(" RPT #8 || NOP"); //正常情况下占用N+1个时钟周期DINT; //屏蔽全局中断InitPieCtrl(); //初始化PIE控制器IER = 0x0000;IFR = 0x0000; //InitPieVectTable(); //初始化PIE中断向量表asm(" RPT #8 || NOP");//InitCpuTimers();//ConfigCpuTimer(&CpuTimer0, 150, 10000); //0.01s//InitGpio();//InitAdc();//InitI2C();//StartDMACH1();//StartDMACH2();InitMcbsp();//InitXintf();//InitScic();EALLOW;PieVectTable.TINT0 = &cpu_timer0_isr;//PieVectTable.EPWM1_INT = &epwm1_isr;//PieVectTable.XINT1 = &ADCINT_ISR; //进行数据采集//PieVectTable.SPIRXINTA=&SPIRXINTA_ISR;//PieVectTable.SCIRXINTC=&SCIRXINTB_ISR;PieVectTable.MRINTB= &MRINTB_ISR;//PieVectTable.MXINTB= &MXINTB_ISR;//PieVectTable.MRINTA= &MRINTA_ISR;//PieVectTable.MXINTA= &MXINTA_ISR;PieVectTable.DINTCH1= &DINTCH1_ISR;//DMAPieVectTable.DINTCH2= &DINTCH2_ISR;//DMAEDIS;PieCtrlRegs.PIECTRL.bit.ENPIE = 1;PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //开CPU定时器中断//PieCtrlRegs.PIEIER1.bit.INTx4 = 1; //AD7606中断//PieCtrlRegs.PIEIER3.bit.INTx1 = 1; ////PieCtrlRegs.PIEIER6.bit.INTx1 = 0; //SPI接收中断//PieCtrlRegs.PIEIER8.bit.INTx5 = 0; //SCI接收中断PieCtrlRegs.PIEIER6.bit.INTx3=1; // Enable PIE Group 6, INT 3PieCtrlRegs.PIEIER6.bit.INTx4=1; // Enable PIE Group 6, INT 4PieCtrlRegs.PIEIER6.bit.INTx5=1; // Enable PIE Group 6, INT 5PieCtrlRegs.PIEIER6.bit.INTx6=1; // Enable PIE Group 6, INT 6PieCtrlRegs.PIEIER7.bit.INTx1=1; // Enable PIE Group 7, INT 1 (DMA CH1)PieCtrlRegs.PIEIER7.bit.INTx2=1; // Enable PIE Group 7, INT 2 (DMA CH2)IER |= (M_INT1 | M_INT3 | M_INT6 | M_INT7);EINT; // Enable Global interrupt INTMERTM; // Enable Global realtime interrupt DBGM。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
McBSP串口操作一、实验目的1.学习C54x的McBSP串口的控制和使用;2.利用VC5402的McBSP串口实现数据的收发;二、实验原理所有的 TMS320C54x 都提供了串口,大多数都支持缓冲串口。
BSP 串行接口能与串行设备,如编/译码器,串行A/D 和D/A 转换器等直接通信。
BSP 支持8,10,12 或16-bit数据单元的发送,同时允许程控串口通讯的时钟频率。
从VC5402 开始,TMS32054x 提供了统一的多通道缓冲串口McBSP。
McBSP 串口是基于TMS320C2X、C20X、C5X、C54X 的标准串口上扩展的,McBSP 提供:·全速双工通信·双缓存发送和三缓存接收数据寄存器,以支持连续传送·收和发使用独立的帧和时钟·直接与多媒体数字信号编解码器的工业标准接口,以及有模拟接口和与串行ADC/DAC 的接口·外部变速时钟发生器,内部可编程时钟发生器此外,McBSP 还有下列功能:·直接与下列格式接口_ T1/E1 framers_ MVIP switching compatible and ST-BUS compliant devices including:_ MVIP framers_ H.100 framers_ SCSA framers_ IOM-2 compliant devices_ AC97 compliant devices_ IIS compliant devices_ SPI_ devices·多通道收发,通道数达 128·字宽可选: 8, 12, 16, 20, 24, and 32 bits· U-Law and A-Law 压缩与扩展· 8 位传输时可选先传: LSB or MSB·帧信号与时钟信号极性可编程1. McBSP 概述McBSP 原理图如图9.1所示。
McBSP 与外设进行数据传输是通过(DX)脚来发送,(RX)脚来接收,通信的时钟与帧信号是由CLKX, CLKR, FSX, and FSR 脚来控制。
DSP 的CPU 或DMA 从数据接收寄存器(DRR[1,2])读取接收数据,发送时向数据发送寄存器(DXR[1,2])写数据。
数据写入(DXR[1,2])后通过传输移位寄存器(XSR[1,2]) 移位输出到DX 上,同样,从DR 上接收的数据移位存储到接收移位寄存器(RSR[1,2]) 并拷贝到接收缓存寄存器(RBR[1,2]) ,然后,再由(RBR[1,2])拷贝到DRR[1,2],DRR[1,2]就可以由CPU 或DMA 来读出。
多级寄存器允许在通信时内部和外部数据同时传输。
C54x 对McBSP 的控制由16 位的控制寄存器实现。
CLKXCLKRFSXFSRCLKS中断到CPU同步事件到DMA 16位外设总线图9.1 McBSP原理图2. McBSP 控制寄存器表 9.1中给出了McBSP 串口的所有控制寄存器。
本实验使用VC5402 的McBSP1串口。
McBSP 每个串口实际占用6个物理地址空间,例如McBSP1 串口中数据发送寄存器为两个(32bit),地址分别为0x42 和0x43。
本实验通过0x43 发送数据(16bit)。
数据接收寄存器为两个(32bit),地址分别为0x40 和0x41。
本实验通过0x41 读取串口接收数据(16bit)。
控制寄存器占用两个地址:0x48 和0x49,而McBSP 串口控制寄存器总共有15 个,所以在访问这些控制寄存器时,先将要访问的寄存器编号(子地址)写入地址寄存器0x48,然后在将数据写入0x49 或从0x49 读出相应的数据。
若要访问另一个控制寄存器,需要再修改地址寄存器。
表9.1 McBSP串口控制寄存器3.串口控制寄存器1 的详细说明(SPCR1):子地址 -> 0x0SPCR1 设置McBSP 串口的数字环回模式、接收符号扩展和校验模式、Clock Stop 模式、DX 是否允许、A-bis 模式、接收中断模式等,并给出接收同步错误、接收移位寄存器(RSR[1,2])空、接收准备好等状态。
此外可以进行接收复位。
本实验RJUST = 01 ,即接收数据不足16BIT 时采用右对齐且符号位扩展方式,另外当RINTM=00 时,接收中断由RRDY 信号产生。
DLB = 0 表示不使用数字环路。
CLKSTP = 0X 表示时钟停止模式,用于非SPI 模式。
DXENA = 0 表示禁止延时发送。
ABIS = 0 表示不使用A-bis 模式。
RSYNCERR= 0 表示不检测同步错误。
该寄存器初始化值为0x2000。
在启动串口接收工作前应将RRST置1,即该寄存器为0x2001。
4.串口控制寄存器2 的详细说明(SPCR2):子地址 -> 0x1SPCR2 设置McBSP 自由运行模式、SOFT 模式、发送中断模式,并给出发送同步错误、发送移位寄存器(XSR[1,2])空、发送准备好等状态。
此外可以进行发送复位、采样率发生器复位、帧同步发生电路复位。
本实验中FREE = 0 ,SOFT = 1 表示若使用仿真器调试时串口在发送完当前字后暂停工作。
若连续运行,这两个BIT 位没有影响。
FRST = 0表示帧同步发生器复位,该BIT 位工作时应设为1。
GRST =0 表示采样率发生器(即串口工作的时钟)电路复位,工作中若该串口需要提供时钟信号时,应设置为1。
XINTM = 00表示串口的发送中断由XRDY 产生。
XSYNCERR = 0 表示不检测同步错。
该寄存器初始化值为0x100。
当串口工作时,应将XRST 为置1,即该寄存器为0x1c1。
5.引脚控制寄存器的详细说明(PCR):子地址 -> 0x0ePCR 设置McBSP 传输帧同步模式、接收帧同步模式、发送时钟模式、接收时钟模式、发送帧同步信号的极性、接收帧同步信号的极性、发送时钟极性、接收时钟极性,并给出CLKS、DX、DR 脚的状态。
此外PCR 还定义发送和接收部分在复位时相应引脚是否配置为通用 I/O。
本实验中,XIOEN 和RIOEN = 0 表示DX,FSX,CLKX,DR,FSR,CLKR,CLKS都配置为串口而非通用I/O 引脚。
FSXM = 1 表示发送帧同步由采样率发生器产生(请参考SRGR2 寄存器的FSGM 位)。
FSRM = 0 表示接收帧同步由外部提供,因为DES3200 实验系统的FSXM 与FSRM 相连。
CLKXM = 1 表示发送时钟由内部采样率发生器产生。
CLKRM =0 表示接收时钟由外部提供,同样因为CLKRM 与CLKXM 连在一起。
FSXP = 1 表示发送帧同步低有效。
FSRP = 1 表示接收帧同步低有效。
CLKXP = 1 表示CLKX 的上升沿发送数据, CLKRP = 0 表示CLKR 的下降沿接收数据。
该寄存器初始化值为0x0a0e。
6.接收控制寄存器1(RCR1)说明:子地址 -> 0x02RCR1 设置McBSP 接收时第一相(FIRST PHASE)的接收帧长度(从1 个字到128 个字、接收字长度(8、12、16、20、24、32bits)。
本实验中设置位每帧1 个字,字长16 bits。
初始值为0x0040。
7.接收控制寄存器2(RCR2)说明:子地址 -> 0x03RCR2 设置McBSP 接收时是否允许第二相(RPHASE=1)。
如果允许,设置McBSP 接收时第二相的接收帧长度(从1 个字到128 个字、接收字长度(8、12、16、20、24、32bits)。
此外, RCR2 设置McBSP 接收时的接收压缩模式、接收同步帧忽略模式、接收数据延迟。
在本实验中,RPHASE = 0 表示只使用单相帧,RCOMPAND = 00 表示接收数据不压扩,且高位在前,RFIG = 0 表示不忽略接收帧同步信号。
该寄存器初始化设置为0x0040 或0x0。
8.发送控制寄存器1(XCR1)说明:子地址 -> 0x04XCR1 设置McBSP 发送时第一相(FIRST PHASE)的发送帧长度(从1 个字到128 个字、发送字长度(8、12、16、20、24、32bits)。
本实验中设置位每帧1个字,字长16bits。
初始值为0x0040。
9.发送控制寄存器2(XCR2)说明:子地址 -> 0x05XCR2 设置McBSP 发送时是否允许第二相(XPHASE=1)。
如果允许,设置McBSP 时第二相的发送帧长度(从1 个字到128 个字、发送字长度(8、12、16、20、24、32bits)。
此外, XCR2 设置McBSP 发送时的发送压缩模式、发送同步帧忽略模式、发送数据延迟。
本实验不允许使用第二相(XPHASE=0),初始设置为 0x0。
10.采样率发生器(串口时钟产生)寄存器SRGR1:子地址 -> 0x06采样率发生器寄存器 1(SRGR1)设置帧正脉冲宽度和数据位时钟分频( CLKG 与输入CLK 频率之比,约定值为1)。
本实验中虽然将FWID 设置为1,即帧同步脉冲宽度=2,但被忽略了(参见后面帧同步发生控制寄存器设置)。
时钟分频寄存器=200(0xC8),表示设置串口时钟为CLKG=100M /200=500K Hz。
本实验中设置为0x1c8。
11.采样率发生器(帧同步信号产生)控制寄存器SRGR2:子地址 -> 0x07采样率发生器寄存器 2(SRGR2)设置采样率发生器时钟同步模式、CLKS 的极性、采样率发生器输入时钟选择、帧周期分频。
本实验中,GSYNC=0 表示采样率发生器是否同步,因CLKSM=1,固该bit 不用。
CLKSP = 0 表示 CLKS 的上升沿产生CLKG 和FSG。
因CLKSM=1 该BIT 也不用。
CLKSM = 1 表示采样率发生器由CPU 时钟驱动。
FSGM = 0 表示帧同步信号由发送位移寄存器自动产生,忽略FPER 和FWID,固FPER =0。
所以该寄存器初始化值为0x2000。
三、实验内容与步骤研究 McBSP 串口的操作,包括串口的初始化和发送中断服务程序的编写,先从串口发送一个正弦信号(该正弦数据由VC5402 的ROM提供),然后在从串口接收该正弦信号,并使用CCS 的图形工具观察结果。
1. 串口的初始化本实验的串口初始化包括两个部分:串口收发中断的设置和串口寄存器的初始化。
根据前面的介绍,DES3200 实验系统的串口1 设置为单相帧,每帧一个字,字长为16bit,发送CLOCK 由内部CPU 时钟产生,频率为500KHz,并输出。