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

news2025/1/16 1:46:14

硬件准备

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);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

执法仪物联卡在哪里采购靠谱

在这个万物互联的时代&#xff0c;针对于企业设备联网的物联卡就显得格外重要了&#xff0c;而共享单车&#xff0c;移动支付&#xff0c;智慧城市&#xff0c;自动售卖机等企业采购物联卡会面临着各种问题&#xff0c;低价陷阱&#xff0c;流量虚假&#xff0c;管理混乱&#…

基于LSTM递归神经网络的多特征电能负荷预测(Python代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Kubernetes 系统化学习之 集群安全篇(七)

Kubernetes 作为一个分布式集群管理的工具&#xff0c;保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介&#xff0c;也是外部控制的入口&#xff0c;所以 K8s 的安全机制就是围绕保护 API Server 来设计的。K8s 使用了认证&#xff08;Authentic…

计算机毕业设计springboot+vue基本微信小程序的大学生竞赛信息发布与报名小程序

项目介绍 大学生竞赛是提升大学生综合能力和专业素质的重要手段和途径,越来越受到广大高校师生的关注与重视。大学生学科竞赛活动不仅有利于提升大学生的专业素养,也有利于提升大学生的创新、实践能力、竞争意识与团队精神。 各类学科竞赛汇总、信息发布、信息收集、报名、备赛…

针对前端项目node版本问题导致依赖安装异常的处理办法

Mac如何切换版本 前端项目开发过程中&#xff0c;多人开发会遇到由于node版本不同造成的依赖不适配。 比如: node 16.xx 大多都会遇到依赖版本与node版本不适配导致安装报错等问题&#xff0c;并且你不管如何更新还是使用稳定版本的node.js都不起作用&#xff0c;此时你需要修…

看直播怎么录屏?这2个方法,一看就会!

​现在很多人在斗鱼、虎牙、斗鱼、腾讯课堂等平台上直播&#xff0c;有些人在视频聊天平台上&#xff0c;如微信上直播。我们如何保存这些直播视频&#xff1f;看直播怎么录屏&#xff1f;今天小编就分享2个方法&#xff0c;教你如何看直播的同时录屏。 看直播怎么录屏方法一&a…

Font字体属性

Font字体属性 源代码 font font属性用于定义字体系列、大小、粗细、和文字样式(如斜体) font-family font-family属性用于定义文本字体&#xff0c;多个字体用 ” , ” 号隔开&#xff0c;一般情况下&#xff0c;有空格隔开的多个单词组成的字体&a…

Eziriz .NET Reactor保护NET代码

Eziriz .NET Reactor保护NET代码 NET Reactor软件是一个简单而小巧的工具&#xff0c;但对保护NET代码非常强大。会的。编程数据可以通过使用本程序、编写的代码和程序来保护&#xff0c;并禁止复制和使用它们。 Eziriz.NET Reactor软件的功能和特点&#xff1a; -支持收集和模…

MODBUS-ASCII协议

MODBUS协议在RS485总线上有RTU和ASCII两种传输格式。 其中ASCII协议应用比较少&#xff0c;主要还是以RTU格式为主。 相比较于RTU的2进制传输&#xff0c;ASCII使用的是文本传输&#xff0c;整个数据包都是可打印字符。 下面是示例&#xff1a; :010300000001FB\r\n 帧头是冒…

GWAS:使用R,比较GLM和MLM对假阳性的控制差异(复刻Nature genetics 图)

目录 1.数据准备 2.代码 如果想知道横纵坐标设置的原理&#xff0c;移步这篇超级棒的文章&#xff01; 我们来复刻如下这张2016年发表在Nature genetics上的一篇文章中比较GLM和MLM的QQ plot&#xff01; 参考文献&#xff1a; Genetic variation in ZmVPP1 contributes t…

Python爬虫项目100例

前言 Python爬虫项目100例&#xff08;一&#xff09;&#xff1a;入门级 CentOS环境安装 和谐图网站爬取 美空网数据爬取 美空网未登录图片爬取 27270图片爬取 蜂鸟网图片爬取之一 蜂鸟网图片爬取之二 蜂鸟网图片爬取之三 河北阳光理政投诉板块 Pyt图虫网多线程爬取…

【计算机视觉+Tensorflow】SORT目标跟踪算法的讲解(图文解释 超详细)

觉得有帮助请点赞关注收藏~~~ 一、目标跟踪简介 目标跟踪算法可以进行轨迹特征的分析和提取&#xff0c;以弥补目标检测的不足&#xff1b;有效地去除误检&#xff0c;提高检测精度&#xff0c;为进一步的行为分析提供基础。例如&#xff0c;在自动驾驶系统中&#xff0c;目标跟…

Kafka知识点

消费者组 kafka的消费者组里面包含一个或多个消费者实例&#xff0c;它们共享一个公共的 ID&#xff0c;这个 ID 被称为 Group ID。一个消费者组可以订阅多个主题&#xff0c;但是同一个消费者组里面的一个实例只能消费一个主题里面的一个分区。 consumer group A kafka consum…

web课程设计网页规划与设计(HTML+CSS+JavaScript仿悦世界游戏官网 6个页面)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

web前端 基于html实现花店购物网站源码(HTML+CSS+JavaScript) 企业网站制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

央国企信创全面加速,如何将数字化转型和信创深度融合?

11月30日&#xff0c;《央国企信创白皮书》正式对外发布&#xff0c;CIO 时代研究院认为&#xff1a;在各行各业深入开展全面数字化转型的背景下&#xff0c;央国企信创工作和数字化转型工作势必并轨同行&#xff0c;既是机遇&#xff0c;亦是挑战。 信创是突破“卡脖子”技术…

Linux权限的理解

主要分为两类讲解&#xff1a;1.对人操作 2.对角色和文件操作 目录 Linux权限管理 文件类型和访问权限&#xff08;事物属性&#xff09; 基本权限 文件访问者的分类 文件权限值的表示方法 文件访问权限的设置方法 目录权限 umask 粘滞位 1.对人&#xff1a; Linux下…

JVM 篇之 牛刀小试 (二)(PS:之前请教我的小伙子校招去了字节~)

闲聊 最近在学jvm&#xff0c;当然这是一个持续过程&#xff0c;知行合一对吧&#xff0c;学习之后立马去应用&#xff0c;才能验证你学到是不是有用的东西。大家看过我上一篇写的博客么&#xff0c;之前在csdn请教过我的一个小伙子&#xff0c;最近我看他已经入职字节跳动了&a…

C++ 类与对象(四)构造函数2、static成员、友元、内部类

目录 1. 再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2. static成员 2.1 概念 2.2 特性 3. 友元 3.1友元函数 3.2 友元类 4. 内部类 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对…