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上设置这个引脚的逻辑电平;
测量引脚的电平,与设置的逻辑电平相比较来检测输出口是否正常工作。
2、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
起始地址寄存器
单元数量和帧数量寄存器
单元索引寄存器和帧索引寄存器
3、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();
4、多媒体卡控制器
支持MMC/SD协议;
软件支持未来的扩展升级;
MMC控制器的运行频率可以通过程序设置;
MMC控制器与存储卡之间控制传输速率的时钟可以通过编程设置,MMC控制器与MMC/SD卡信号连接关系图:
MMC/SD模式:
MMC/SD模式写:
WR CMD: 批量写命令,6字节长,由DSP发给存储卡
CMD RSP: 写命令回复。是存储卡发给DSP批量写回执,通知DSP已经收到批量写命令;
DAT BLK: 数据块。是DSP向存储卡写的数据,该数据块包括在开始有起始位,结束时则有两个字节的CRC校验和一个结束位;
CRC STAT:CRC状态。存储卡发给DSP的一个字节的错误校验状态信息,如果校验正确则数据被存储卡接受,错误则数据被丢弃,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命令
MMC/SD模式初始化:
使MMC控制寄存器MMCCTL中的CMDRST和DATRST位进入复位状态,并在其他位中写入数值;
写其他寄存器完成配置;
清除CMDRST和DATRST位使控制器脱离复位状态,应注意不改变第一步中写入的其他数值;
使能CLK引脚,向存储卡送出时钟信号。
行为监测:
通过MMC状态寄存器进行检测;
包括DAT3边缘监测、接收数据就绪、发送数据就绪、数据错误、回复CRC错误、读取数据CRC错误、写数据CRC错误、回复超时、读取数据超时、命令/回复执行、忙状态、数据传输状态、DAT3状态、传输数据空、接收数据空、时钟停止状态等。
MMC控制器的应用:
完成MMC控制器的设置,首先定义配置结构:
MMC_Config myMMCCfg = {
0x000F, /* MMCCTL */
0x0F00, /* MMCFCLKCTL */
0x0001, /* MMCCLK */
0x0FA0, /* MMCIm */
0x0500, /* MMCTOR */
0x0500, /* MMCTOD */
0x0200, /* MMCBLEN */
0x0001 /* MMCNBLK */
};
调用MMC_open( )函数打开MMC设备:
MMC_Handle myMmC;
myMmc = MMC_open(MMC_DEV0);
调用MMC_config( )配置MMC控制器:
MMC_config(myMMC, &myMMCCfg);
在完成MMC设备配置后可用MMC_read( )函数读取数据
Uint16 mybuf[512];
MMC_read(myMmc, 0, mybuf, 512);
如果要MMC控制器操作结束,可调用MMC_close()函数关闭MMC控制器:
MMC_close(myMmc);
5、通用串行总线(USB)
USB总线是通过串行差模信号传递数据的,其中DP接差分正信号,DN接差分负信号,差分正信号通过一个1.5KΩ的电阻与PU连接。
按照传输的类型分类:
控制传输;
批量传输;
同步传输和中断传输;
USB的DMA控制器。
使用DMA控制器时应注意:
每个通用端点都必须工作在双缓冲模式下,DMA控制器交替使用每个端点的X缓冲区和Y缓冲区,而必须从X缓冲区开始数据传输;
USB的DMA控制器访问DSP的内存是通过处理器DMA控制器的辅助端口进行的,这个辅助端口是和EHPI接口共享的,而USB模块享有更高的优先级;
DMA控制器与DSP的其他部分共享外部存储器接口,外部存储器接口根据预先设置的优先级控制来自DSP芯片内部的访问申请。当USB的DMA控制器访问外部存储器时,DMA控制器向外部存储器接口发出一个申请并等待服务;
主机-DMA模式;
USB模块中的中断。