830 likes | 1.01k Views
TMS320C55X 的片内集成外设开发及测试. C55x 片内外设与芯片支持库简介 时钟发生器 通用定时器 外部存储器接口 主机接口( EHPI ) 多通道缓冲串口 McBSP 通用输入 / 输出端口 GPIO DMA 控制器 I 2 C 总线 多媒体卡控制器 通用串行总线( USB ) 模 / 数转换器( ADC ) 实时时钟( RTC ) 看门狗定时器( Watchdog ) 异步串口( UART ). C55x 的片内外设分类. 时钟与定时器 时钟产生器 产生 CPU 的工作时钟,并提供 CLKOUT 时钟输出;
E N D
TMS320C55X的片内集成外设开发及测试 C55x片内外设与芯片支持库简介 时钟发生器 通用定时器 外部存储器接口 主机接口(EHPI) 多通道缓冲串口McBSP 通用输入/输出端口GPIO DMA控制器 I2C总线 多媒体卡控制器 通用串行总线(USB) 模/数转换器(ADC) 实时时钟(RTC) 看门狗定时器(Watchdog) 异步串口(UART)
C55x的片内外设分类 • 时钟与定时器 • 时钟产生器 • 产生CPU的工作时钟,并提供CLKOUT时钟输出; • 通用定时器、时时钟以及看门狗定时器 • 通过计数器为系统提供定时时钟和年、月、日、时、分、秒等时钟信号,以及监控系统正常运行的看门狗时钟,并能发出相应中断 • 外部设备连接接口 • 外部存储器连接接口 • 用来同并行存储器连接、同外部并行设备进行连接 • 主机接口 • 用来对DSP进行控制、程序加载、数据传输等工作
信号采集 • 采集模拟信号的模/数转换器 • 提供数字信号输入、输出功能的通用输入/输出接口 • 通信接口 • 多通道缓冲串口、I2C接口、异步串口、USB接口以及多媒体卡/SD卡接口 • 其他外设 • DMA控制器、指令流水线等 • 辅助CPU工作,提高DSP的工作效率
片上外设支持库特点: • 采用标准协议对外设进行编程 • 数据类型 • 定义外设配置的宏定义 • 实现各种外设操作的函数 • 基本资源管理 • 设备的符号描述
时钟发生器 时钟输出 时钟模式寄存器CLKMD 时钟模式寄存器
工作模式 • 旁路模式(BYPASS) • BYPASS DIV=00,输出时钟信号的频率与输入信号的频率相同,即一分频 • BYPASS DIV=01,输出时钟信号的频率是输入信号频率一半,即二分频 • BYPASS DIV=1x,输出时钟信号的频率是输入信号频率1/4,即四分频 • 锁定模式(LOCK)
CLKOUT输出 • 频率由系统寄存器(SYSR)中的CLKDIV确定: • CLKDIV=000b,CLKOUT的频率等于CPU时钟的频率 • CLKDIV=001b,CLKOUT的频率等于时钟的频率的1/2 • CLKDIV=010b,CLKOUT的频率等于时钟的频率的1/3 • CLKDIV=011b,CLKOUT的频率等于时钟的频率的1/4 • CLKDIV=100b,CLKOUT的频率等于时钟的频率的1/5 • CLKDIV=101b,CLKOUT的频率等于时钟的频率的1/6 • CLKDIV=110b,CLKOUT的频率等于时钟的频率的1/7 • CLKDIV=111b,CLKOUT的频率等于时钟的频率的1/8
使用方法 • 省电(IDLE) • 与省电有关的位是IAI • DSP复位 • CLKMD引脚为低电平,输出频率等于输入频率; • CLKMD引脚为高电平,输出频率等于输入频率的一半 • 失锁 • 锁相环对输入时钟跟踪锁定之后,由于其他原因使其输出时钟发生偏移
使用方法及实例 • 利用库函数配置时钟发生器的方法 • 首先要声明PLL配置结构,具体声明如下: PLL_Config Config_PLL = { 1, /*iai 休眠后重新锁相 */ 1, /*iob 失锁后进入旁路模式并重新锁相 */ 6, /*pllmult CLKIN * pllmult = DSP主时钟*/ 0 /*div CLKOUT= DSP主时钟/(div+1) */ }; • 之后运行配置函数: PLL_config(&Config_PLL); 也可以通过函数设置PLL频率: PLL_setFreq (6, 1); 通过PLL_setFreq函数可以复位PLL锁相环,并改变倍频和分频数从而得到所需的频率
时钟发生器的调试 • 检查DSP的时钟输入引脚CLKIN、时钟输出引脚CLKOUT和时钟模式引脚CLKMD连接是否正确,正常情况下CLKIN应接时钟源,而CLKMD应拉高或拉低,CLKOUT应是信号输出引脚 • 系统加电后测量CLKIN引脚时钟输入是否正常,信号的高低电平及占空比是否满足需要 • 在没有进行软件设置的情况下,DSP在复位后CLKOUT的输出直接受CLKMD控制,当CLKMD为高,CLKOUT的输出频率将等于CLKIN的频率,CLKMD为低,则CLKOUT输出将等于CLKIN的频率的1/2 • 如果以上步骤运行正常,则利用软件设置CLKMD寄存器,使时钟产生器工作于PLL锁相环模式下,此时再检测CLKOUT信号,查看锁相环是否正常工作
通用定时器 结构框图—20位的定时器
定时器的工作模式 • 当FUNC=00b时,TIN/TOUT为高阻态,时钟源是内部时钟(CPU时钟)。 • 当FUNC=01b时,TIN/TOUT为定时器输出,时钟源是内部时钟(CPU时钟)。 • 当FUNC=10b时,TIN/TOUT为通用输出,时钟源是内部时钟(CPU时钟)。 • 当FUNC=11b时,TIN/TOUT为定时器输入,时钟源是外部时钟
使用方法 • 初始化定时器 • 停止计时(TSS=1),定时器装载使能(TLB=1),并将周期寄存器(TIM,PSC)的内容复制到计数寄存器(PRD,TDDR); • 将预定标计数周期数写入TDDR; • 将主计数器周期数装入PRD; • 关闭定时器装载(TLB=0),启动计时(TSS=0) • 停止/启动定时器 • TSS=1,停止计时 • TSS=0,启动计时 • DSP复位
通用定时器的应用 • 首先定义通用定时器句柄和配置结构: TIMER_Handle hTimer; TIMER_Config Config_TIMER = { 0X0310, /*; 载入TCR0t:; IDLE_EN = 0 (不允许空闲状态); FUNC = 00b (引脚为高阻态) ; TLB = 0 (TLB 被清除); FREE = 1 (遇到断点时时钟不停止) ; PWID = 00b (脉冲延迟一个CPU 时钟周期) ; ARB = 1 (当TIM计数到0时重新载入TIM和PSC) ; TSS = 1 (停止计数器); C/P = 0 (引脚输出为脉冲模式) ; POLAR = 0 (引脚信号开始为低); 其他为0 */ 0X197, /* prd = 407 */ 0X0007 /* prsc = 7 TDDR=7 */ //; 计数器每3264(408*8) 个时钟周期输出: };
接下来打开句柄: hTimer = TIMER_open(TIMER_DEV0,0); //设置计数器0,中断20K/s 调用定时器配置函数对计数器初始化: TIMER_config(hTimer,&Config_TIMER); 调用定时器开始函数使定时器开始工作: TIMER_start(hTimer); 如果在程序中需要暂时停止定时器计数可以调用定时器停止函数: TIMER_stop(hTimer); 当使能定时器中断时,则当定时中断发生时将运行定时中断服务程序: interrupt void Timer0_Isr() { …… }
通用定时器的调试 • 设定通用定时器的时钟源,通用定时器的时钟源可以是CPU时钟,也可由外部信号提供,如果选择外部时钟,则需要将这个信号从TIN/TOUT引脚引入,应当注意此时TIN/TOUT引脚将不能够作为定时器输出使用。 • 正确设置定时器寄存器值,使定时器开始工作。 • 在定时器中断服务程序中设置断点,看能否进入定时中断,如果定时器的时钟源是CPU时钟,这时也可以将定时器信号从TIN/TOUT引脚输出,通过示波器检测定时器输出是否正常。
外部存储器接口 功能与作用
外部寄存器接口硬件连接与配置 • 异步存储器接口 • 同步突发静态存储器(SBSRAM) • 同步突发动态存储器(SDRAM) C55x与一片64Mbit(16位宽)SDRAM的连接
C55x与一片64Mbit(32位宽)SDRAM的连接 C55x与一片128M位(x32)SDRAM的连接
外部寄存器接口的软件设置 主机接口(EHPI)
EHPI口的寄存器 • 数据寄存器(HPID) • 16位寄存器,用来存放输入/输出的数据 • 地址寄存器(HPIA) • 16位或20位寄存器 • 控制寄存器(HPIC) • 控制数据的传输
多通道缓冲串口McBSP • 功能和特点 • 全双工通信; • 双缓冲数据寄存器,允许传送连续的数据流; • 独立的收发时钟信号和帧信号; • 可用128个通道进行收发; • 可与工业标准的编解码器、模拟接口芯片(AICs)以及其他串行A/D、D/A芯片直接接口连接; • 能够向CPU发送中断,向DMA控制器发送DMA事件 • 具有可编程的采样率发生器; • 可设置帧同步脉冲和时钟信号的极性; • 传输的字长可以是8位、12位、16位、20位、24位或32位 • 具有µ律和A律压缩扩展功能; • 可将McBSP引脚配置为通用输入/输出引脚
采样率发生器 • 产生内部数据时钟CLKG和内部帧同步信号FSG
多通道选择 • 接收多通道选择 • 由MCR1中的RMCM位确定 • 通道可以独立地被使能或禁止,使能通道的选择由接收通道使能寄存器RCER确定 • 如果某个接收通道被禁止,在这个通道上接收的数据只传输到接收缓冲寄存器RBR中,并不复制到DRR,因此不会产生DMA同步事件 • 发送多通道选择 • 由MCR2中的XMCM字段确定 • 当XMCM=00b时,所有128发送通道使能且不能被屏蔽 • 当XMCM=01b时,由发送使能寄存器XCER选择通道,如该通道没有被选择则该通道被禁止 • 当XMCM=10b时,由XCER寄存器禁止通道,如果该通道没有被禁止则通道使能 • 当XMCM=11b时,所有通道被禁止用,而只有当对应的接收通道使能寄存器RCER使能时发送通道才被使能,当该发送通道使能时,由XCER寄存器决定该通道是否被屏蔽
异常处理 • 接收数据溢出 • SPCR1中的RFULL=1 • 同步帧同步信号错误 • SPCR1中的RSYNCERR=1 • 发送数据重写 • 发送寄存器空 • SPCR2中的XEMPTY=0 • 发送帧同步脉冲错误 • SPCR2中的XSYNCERR=1
McBSP寄存器 • 收发通道寄存器 • 时钟和帧同步寄存器 • 主要用于控制时钟和帧同步信号的产生、收发数据帧格式和串口状态的检测等 • 多通道选择寄存器 • 多通道控制寄存器 • 两个多通道控制寄存器MCR1和MCR2 • 收发通道使能寄存器 • 有8个接收通道使能寄存器RCERA到RCERH和8个发送通道使能寄存器XCERA到XCERH
多通道缓冲串口的应用 • McBSP串口的测试 • DSP内部连接测试 • 外部设备连接测试
通用输入/输出端口GPIO • GPIO口概述 • 8个专门的通用输入/输出引脚IO0~IO7 • 引脚的方向可以由I/O方向寄存器IODIR独立地配置 • 输入/输出逻辑状态由I/O数据寄存器IODATA反映
驱动程序开发 • 读取GPIO数据寄存器的例子: • int iodata; iodata = GPIO_RGET(IODATA); • 设置GPIO寄存器 • GPIO_RSET(IODIR, iodata);
通用输入/输出GPIO的测试 • 输入口测试 • 通过I/O方向寄存器IODIR设置某一个引脚为输入方向 • 在已设置为输入方向的引脚上外加LVTTL信号 • DSP访问I/O数据寄存器IODATA查,看引脚上的逻辑电平,与外加LVTTL电平进行比较,来检测输入口是否工作正常 • 输出口测试 • 通过I/O方向寄存器IODIR设置某一个引脚为输出方向 • 在I/O数据寄存器IODATA上设置这个引脚的逻辑电平 • 测量引脚的电平,与设置的逻辑电平相比较来检测输出口是否正常工作
DMA控制器 • 概述 • DMA可以独立于CPU工作; • 有4个标准端口(port)与DARAM、SARAM、外部存储器和外设相连; • 一个辅助端口用于HPI和存储器之间的数据传送 • 具有6个通道; • 可以设置每个通道的优先级; • 每个通道的传输可以由选定事件触发; • 当操作完成之后,DMA控制器可向CPU发出中断
通道和端口 • DMA控制器有6个通道,用于4个标准端口之间的数据传送,每个通道可以从某个端口读取数据,也可以将数据写入某个端口 • DMA控制器的寄存器有两套: • 配置寄存器,供CPU写入所需的配置值 • 工作寄存器,供DMA工作时使用
HPI的配置 • HPI和DMA通道的关系由DMAGCR寄存器中的EHPIEXCL位确定 • 当EHPIEXCL=0,HPI和DMA通道共享DARAM、SARAM和EMIF • 当EHPIEXCL=1,HPI独占DARAM和SARAM,DMA通道只能访问EMIF和外设 • DMA通道和HPI具有可编程的优先级
DMA传输配置 • 数据传输单位 • 字节(Byte):一个字节是DMA通道最小的数据传输单位 • 单元(Element):若干个字节构成的数据传输单位称为一个单元 • 帧(Frame):若干个单元构成的数据传输单位称为一帧 • 块(Block):若干个帧构成的数据传输单位称为一个块 • 数据打包 • 当DST(SRC)PACK=0时,不打包; • 当DST(SRC)PACK=1时,对数据打包后再传输
端口 • 当DST(SRC)= xx00时,目的(源)端口为SARAM; • 当DST(SRC)= xx01时,目的(源)端口为DARAM; • 当DST(SRC)= xx10时,目的(源)端口为EMIF • 当DST(SRC)= xx11时,目的(源)端口为Peripheral • 数据源和目的地址 • 当DST(SRC)AMODE=00时,目的(源)地址为固定地址,用于单元的传输; • 当DST(SRC)AMODE=01时,目的(源)地址在每个单元传输完后自动增加 • 当DST(SRC)AMODE=10时,目的(源)地址在每个单元传输完后自动增加一个索引值 • 当DST(SRC)AMODE=11时,目的(源)地址在每个单元传输完后按单元索引和帧索引自动增加
DMA控制器的寄存器 • DMA全局控制寄存器DMAGCR • DMA通道控制寄存器DMACCR • 源和目的参数寄存器DMACSDP • 起始地址寄存器 • 单元数量和帧数量寄存器 • 单元索引寄存器和帧索引寄存器 • 使用方法及实例
I2C总线 I2C总线简介
I2C模块的使用(K=1024,k=1000) • 给出I2C初始化结构: • I2C_Init Init = { 0, /* 7位寻址模式 */ 0x0000, /* 自身地址(主模式下可忽略 */ 144, /* 时钟输出数(MHz) */ 400, /* 信息传递速率(10~400kbps)*/ 0, /* 接收或发送的位或字节数(8)*/ 0, /* 数字回环模式*/ 1 /* 自由操作模式*/ }; • 调用初始化函数初始化I2C模块: • I2C_init(&Init);
设置中断服务程序结构: • I2C_IsrAddr addr = { myALIsr, myNACKIsr, myARDYIsr, myRRDYIsr, myXRDYIsr }; • 调用中断向量表定位函数并将I2C中断函数指针指向中断服务程序: • IRQ_setVecs(0x10000); //将中断向量指针设置为0x10000 I2C_setCallback(&addr); //将I2C中断函数指针指向中断服务程序结构 • 使能接收就绪中断: • I2C_eventEnable(I2C_EVT_RRDY); • 打开全局中断: • IRQ_globalEnable();
多媒体卡控制器 MMC控制器与MMC/SD卡信号连接关系图 • 简介 • 支持MMC/SD协议和SPI协议; • 软件支持未来的扩展升级; • MMC控制器的运行频率可以通过程序设置; • MMC控制器与存储卡之间控制传输速率的时钟可以通过编程设置
MMC/SD模式 • MMC/SD模式写 • WR CMD:批量写命令,6字节长,由DSP发给存储卡 • CMD RSP:写命令回复。是存储卡发给DSP批量写回执,通知DSP已经收到批量写命令; • DAT BLK:数据块。是DSP向存储卡写的数据,该数据块包括在开始有起始位,结束时则有两个字节的CRC校验和一个结束位; • CRC STAT:CRC状态。存储卡发给DSP的一个字节的错误校验状态信息,如果校验正确则数据被存储卡接受,错误则数据被丢弃,CRC状态的内容也需要添加起始位和结束位; • BSY:忙。CRC状态信息之后将跟随一串为低的数据流,标志着存储卡处在繁忙状态,直到数据被存到存储卡的闪存存储器中
MMC/SD模式读 • RD CMD:批量读命令,6字节长,由DSP发给存储卡 • CMD RSP:读命令回复。是存储卡发给DSP批量读回执,通知DSP已经收到批量读命令; • DAT BLK:数据块。是DSP从存储卡读的数据,该数据块包括在开始有起始位,结束时则有两个字节的CRC校验和一个结束位 • 卡识别操作 • 通过命令寄存器(MMCCMD)发出GO_IDLE_STATE广播命令,使所有卡进入静止状态; • 发出ALL_SEND_CID广播命令,通知所有卡进行识别操作 • 等待卡回应,如果有卡进行回应则进行第4步,否则停止 • 从回应寄存器(MMCRSP7~ MMCRSP70)中读取CID,并通过SET_RELATIVE_ADDR命令为存储卡分配一个相应的地址; • 返回第(3)步
单块写操作 • 向参数寄存器MMCARG写入要进行写的卡的相关地址,地址的高位写入MMCARGH,低位写入MMCARGL; • 通过命令寄存器发出SELECT/DESELECT_CARD广播命令,该命令用来选择/不选某块卡; • 向参数寄存器写入目标地址; • 向数据传送寄存器写入所传送的数据块中的第一个字节; • 向存储卡发出WRITE_BLOCK命令; • 用状态寄存器0检测错误,在判断字节发送成功后,如果数据没有全部写完则进入第(7)步,如果写完了则停止; • 写入数据块的下一个字节,并返回第(6)步。
单块读操作 • 向参数寄存器写入卡的相应地址; • 通过命令寄存器发出SELECT/DESELECT_CARD广播命令,该命令用来选择/不选某块卡; • 向参数寄存器写入目标地址; • 如果块的长度同先前操作中块的长度不同,则发出SET_BLOCKLEN命令改变块的长度; • 发出READ_SINGLE_BLOCK命令; • 用状态寄存器0检测错误,在判断字节被成功的接收后,如果数据没有全部接收完则进入第(7)步,如果接收完了则停止; • 从数据接收寄存器中读取新的数据字节,并返回第(6)步
多块读操作 • 向参数寄存器写入卡的相应地址; • 如果块的长度同先前操作中块的长度不同,则发出SET_BLOCKLEN命令改变块的长度,数据块的长度必须是512字节; • 发出READ_MULT_BLOCKS命令; • 用状态寄存器0检测错误,在判断字节被成功的接收后,如果数据没有全部接收则进入第5步,如果数据接收完了则进入第(6)步; • 从数据接收寄存器中读取新的数据字节,并返回第(4)步; • 发出STOP_TRANSMISSION命令