硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

接口功能介绍

ADSP-BF533上有两个 SPORT 口,SPORT(synchronous serial ports)接口是 ADSP-BF53x 上速度最快的串口,其速度可以达到系统时钟的 1/2, 每一个 SPORT 口有两根接收数据线和两根传输数据线,支持全双工模式传输。

SPORT 接口通常用做一些高速的数据传输,它支持 I2S 模式,通常将 SPORT 接口连接音频的编解码器芯片,作为音频数据输出接口。

SPORT 时钟频率配置:
SPORTx_TCLK frequency = (SCLK frequency)/(2 x (SPORTx_TCLKDIV + 1))
SPORTx_RCLK frequency = (SCLK frequency)/(2 x (SPORTx_RCLKDIV + 1))

SPORT 同步信号频率配置:
SPORTxTFS frequency = (TSCLKx frequency)/(SPORTx_TFSDIV + 1)
SPORTxRFS frequency = (RSCLKx frequency)/(SPORTx_RFSDIV + 1)

不同模式下,寄存器配置值:

接口寄存器说明

核心代码分析

*pSPORT1_TCLKDIV = TCLKDIV; //配置 SPORT 传输接口的时钟频率
*pSPORT1_TFSDIV = TFSDIV; //配置 SPORT 传输接口的同步频率
*pSPORT1_TCR1 = ITFS|TFSR|ITCLK; //配置 SPORT 传输工作模式
*pSPORT1_TCR2 = 31; //配置 SPORT 以 32Bit 数据传输
*pDMA4_PERIPHERAL_MAP = 0x4000; //设置 SPORT 传输接口 DMA
*pDMA4_CONFIG = WDSIZE_32 | DI_EN |FLOW_1; //设置 DMA 工作模式
*pDMA4_START_ADDR = (void *)iTxBuffer; //设置 DMA 传输数据起始地址
*pDMA4_X_COUNT = 1000; //设置 DMA 传输次数
*pDMA4_X_MODIFY = 4; //设置 DMA 每次地址增量变化
*pDMA4_CONFIG = (*pDMA4_CONFIG | DMAEN); //使能传输 DMA
*pSPORT1_TCR1 = (*pSPORT1_TCR1 | TSPEN); //使能传输 SPORT
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xfff32fff; //配置 SPORT DMA 中断等级
*pSIC_IAR2 = 0xffffffff;
register_handler(ik_ivg9, Sport1_RX_ISR); //注册接收中断
register_handler(ik_ivg10, Sport1_TX_ISR); //注册传输中断
*pSIC_IMASK = 0x00001800; //打开 SPORT 传输和接收中断屏蔽
EX_INTERRUPT_HANDLER(SPORT1_TX_ISR) //传输 DMA 中断函数
{
*pDMA4_IRQ_STATUS = 0x0001; //清除中断标志位
printf(“SPORT TX DMA Done!\n”); //打印信息
*pSIC_IMASK &= ~0x00001000; //屏蔽接收中断
}

代码实现功能

代码实现了通过 SPORT1 接口利用 SPORT1 DMA 传输数据和接收数据,SPORT1 接口时钟和同步信号采用内部由系统时钟配置分频获取。

代码描述了 SPORT1 接口使用 DMA 传输时常用的配置,由于没有和其他设备做通讯,所以看不到接收的实际数据。

也可以将扩展接口上 SPORT1 的 DT1PRI 和 DR1PRI 两个接口短接,实现环路测试功能,通过接收数据Buffer 查看收到的数据。

程序源码

#include <cdefBF533.h>
#include <sys\exception.h>

#define FLOW_1 0x1000

unsigned char iTxBuffer[4000];
unsigned char iRxBuffer[4000];

EX_INTERRUPT_HANDLER(Sport1_RX_ISR);
EX_INTERRUPT_HANDLER(Sport1_TX_ISR);

void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}

void Set_PLL(int pmsel,int pssel)
{
int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}

void Init_Sport1_RX(int RCLKDIV,int RFSDIV)
{
*pSPORT1_RCLKDIV = RCLKDIV; //配置SPORT接收接口的时钟频率
*pSPORT1_RFSDIV = RFSDIV; //配置SPORT接收接口的同步频率
*pSPORT1_RCR1 = IRCLK|RFSR; //配置SPORT接收工作模式
*pSPORT1_RCR2 = 31; //配置SPORT以32Bit数据接收
}

void Init_Sport1_TX(int TCLKDIV,int TFSDIV)
{
*pSPORT1_TCLKDIV = TCLKDIV; //配置SPORT传输接口的时钟频率
*pSPORT1_TFSDIV = TFSDIV; //配置SPORT传输接口的同步频率
*pSPORT1_TCR1 = ITFS|TFSR|ITCLK; //配置SPORT传输工作模式
*pSPORT1_TCR2 = 31; //配置SPORT以32Bit数据传输
}

void Init_DMA(void)
{
*pDMA3_PERIPHERAL_MAP = 0x3000; //设置SPORT接收接口DMA
*pDMA3_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1; //设置DMA工作模式
*pDMA3_START_ADDR = (void *)iRxBuffer; //设置DMA 接收数据起始地址
*pDMA3_X_COUNT = 1000; //设置DMA接收次数
*pDMA3_X_MODIFY = 4; //设置DMA每次地址增量变化

*pDMA4_PERIPHERAL_MAP = 0x4000;                         //设置SPORT传输接口DMA
*pDMA4_CONFIG = WDSIZE_32 | DI_EN |FLOW_1;             //设置DMA工作模式
*pDMA4_START_ADDR = (void *)iTxBuffer;                 //设置DMA 传输数据起始地址
*pDMA4_X_COUNT = 1000;                                 //设置DMA传输次数
*pDMA4_X_MODIFY = 4;                                   //设置DMA每次地址增量变化

}

void Enable_DMA_Sport1_RX(void)
{
*pDMA3_CONFIG = (*pDMA3_CONFIG | DMAEN); //使能接收DMA
*pSPORT1_RCR1 = (*pSPORT1_RCR1 | RSPEN); //使能接收SPORT
}

void Enable_DMA_Sport1_TX(void)
{
*pDMA4_CONFIG = (*pDMA4_CONFIG | DMAEN); //使能传输DMA
*pSPORT1_TCR1 = (*pSPORT1_TCR1 | TSPEN); //使能传输SPORT
}

void Init_Interrupts(void)
{
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xfff32fff; //配置SPORT DMA中断等级
*pSIC_IAR2 = 0xffffffff;

register_handler(ik_ivg9, Sport1_RX_ISR);                //注册接收中断
register_handler(ik_ivg10, Sport1_TX_ISR);              //注册传输中断    *pSIC_IMASK = 0x00001800;                              //打开SPORT传输和接收中断屏蔽

}

EX_INTERRUPT_HANDLER(Sport1_RX_ISR) //接收DMA中断函数
{
*pDMA3_IRQ_STATUS = 0x0001; //清除中断标志位

printf("SPORT RX DMA Done!\n");                            //打印信息*pSIC_IMASK &= ~0x00000800;                              //屏蔽接收中断

}

EX_INTERRUPT_HANDLER(Sport1_TX_ISR) //传输DMA中断函数
{
*pDMA4_IRQ_STATUS = 0x0001; //清除中断标志位

printf("SPORT TX DMA Done!\n");                            //打印信息*pSIC_IMASK &= ~0x00001000;                              //屏蔽接收中断

}

main()
{
int i;
Set_PLL(16,4);
Init_EBIU();
Init_SDRAM();

for(i=0;i<4000;i++)            //产生测试数据iTxBuffer[i]=i;Init_Sport1_TX(7,9);        //初始化Sport1传输接口
Init_Sport1_RX(7,9);        //初始化Sport1接收接口
Init_Interrupts();          //初始化中断
Init_DMA();                 //初始化DMA
Enable_DMA_Sport1_TX();     //使能Sport1传输接口及DMA
Enable_DMA_Sport1_RX();     //使能Sport1接收接口及DMA
while(1);

}

ADI Blackfin DSP处理器-BF533的开发详解10:SPORT-IIS口驱动和应用(含源代码)相关推荐

  1. ADI Blackfin DSP处理器-BF533的开发详解15:RS232串口的实现(含源代码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 硬件设计原理图 实现原理 ADSP-EDU-B ...

  2. ADI Blackfin DSP处理器-BF533的开发详解31:汉字/ASIC II 字库(含源代码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 功能介绍 代码实现了汉字库和 ASIC II ...

  3. ADI Blackfin DSP处理器-BF533的开发详解16:KEY按键的实现(含源代码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 硬件设计原理图 实现原理 ADSP-EDU-B ...

  4. ADI Blackfin DSP处理器-BF533的开发详解4:中断的使用方法(含源代码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 接口功能介绍 ADSP-BF533的 16 个 ...

  5. ADI Blackfin DSP处理器-BF533的开发详解68:电子琴的小应用(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 代码实现功能 代码实现了触摸屏电子琴的功能,运 ...

  6. ADI Blackfin DSP处理器-BF533的开发详解28:SD卡的文件系统(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 功能介绍 代码实现了通过文件系统读取 SD 卡 ...

  7. ADI Blackfin DSP处理器-BF533的开发详解1:软件和硬件的准备

    BF533是ADI Blackfin系列DSP处理器里的最经典型号,这个DSP我用了20年,单就这一颗DSP来讲,我相信国内应该没有比我更资深的了,下面就来说一说这颗DSP. 这颗IC是Blackfi ...

  8. ADI Blackfin DSP处理器-BF533的开发详解3:GPIO(含源代码)

    我们从最基础的GPIO开始,先讲外设,这玩意不管是单片机,还是ARM,又或是FPGA,甚至SOC的芯片,都有GPIO,有共性,就好理解,让我们看看在ADI的DSP里头,GPIO是怎么一回事吧. 硬件准 ...

  9. ADI Blackfin DSP处理器-BF533的开发详解58:DSP控制ADXL345三轴加速度传感器的应用(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

最新文章

  1. 新课推介 | 《大数据技术的商业应用与实践》就要开课啦!
  2. 计算机一级ppt难点,计算机一级复习.ppt
  3. java接口和实例_java – 接口和实例化
  4. CentOS 7 安装方式汇总
  5. CSS3的弹性盒子flex详解(1)
  6. android开机优化服务,Android开机速度优化简单回顾
  7. linux useradd 数字,详解linux useradd用户组合权限管理等
  8. 简简单单的代码让你轻松学会 动态代理
  9. 时间紧任务重---extjs的学习就这么开始吧
  10. 终于没刘海了!iPhone12 Pro 渲染图首曝,回归经典
  11. HTML绘制机器人代码,C#编写机器人PCSDK程序-界面程序上画机器人跟着画
  12. 机器学习基础(四十五)—— 模拟退火(Simulated Annealing)
  13. 磁力泵的结构特点及使用与维修
  14. 自学Python+Selenium自动化测试
  15. matlab输出相反数,在MATLAB将等于某一数列相反数的数据都赋值为0
  16. authorization cache cannot be obtained
  17. IOS版本回退操作教程
  18. matlab做误差棒图,科学网—Matlab误差棒、图例、颜色配比,很有用的代码 - 周锋的博文...
  19. UVALive 4043 Ants(最大权匹配)
  20. Android开发——打包apk遇到The destination folder does not exist or is not writeable

热门文章

  1. Docker 自建 Bitwarden 密码服务器 centOS + 宝塔面板
  2. iOS- JSPatch 热更新
  3. html入门基础-边框设计(入门级)
  4. 浅谈分布式学习(SGD)中提高速率的方法
  5. S7-1212C AC/DC/DLY作为PN主站通过PROFINET转Modbus RTU网关设备与Micro Logix 140
  6. DIN EN ISO 4589-2塑料 用氧指数法测定燃烧行为 第2 部分:室温试验
  7. Axure 原型基本介绍
  8. 【调剂】浙江工业大学信息工程学院宣琦课题组诚招2020级研究生
  9. 失效模式与效应分析 :Failure Mode and Effect Analysis
  10. endnote导出格式下载地址