作者的话
ADI的双核DSP,最早的一颗是Blackfin系列的BF561,这颗DSP我用了很久,比较熟悉,且写过一些给新手的教程。
硬件准备
ADZS-BF561-EZKIT开发板:ADI原厂评估板
AD-ICE20000仿真器:ADI现阶段性能最好的DSP仿真器
产品链接:https://item.taobao.com/item.htm?id=753233120844
软件准备
Visual DSP++5.1.2
CCES2.11.1
硬件环境的搭建
程序内容
利用 ADSP-BF561 处理器 EBIU(外部总线接口单元)与 CPLD 的无缝连接,通过对异步 Bank3 的写操作,从而实现数码管和 LED 的程序控制。
实现原理
利用 CPLD 做一个 LED 控制器,用于动态扫描 LED 的显示。通过 BF561 的 EBIU接口控制 LED 的显示字符。
我设计了 2 个数码管和 8 个 LED 指示灯。数码管和 LED 复用数据总线,采用 74HC245 作为总线驱动芯片。CPLD 内部固化了一个 LED 控制器,控制器采用动态扫描的方式维持 LED 显示。使用时 ADSP-BF561 处理器只需通过 EBIU 接口向 CPLD 内部的LED 控制器送入需要显示的内容,LED 控制器会自动将所要显示的数据锁存,并通过扫描维持该数据的显示,直到 BF561 重新向控制器送入数据信息。
其中pLED_DAT_OUT的数据D0-D7分别对应的数码管的8段a-h。
实验时驱动代码的编写过程要按照以下步骤进行
第一:向pCtrOut_Flag_OE寄存器写入数据,使能驱动器HC245 LED_OE=0。
第二:选择写入地址向pCtrOut_Flag_B对应的LED_A1和LED_A0写入数据。
第三:向pLED_DAT_OUT寄存器写入要显示的参数。
第四:控制pCtrIner_Flag寄存器的LEDCS位,使其产生一个上升沿,此时数据写入相应的寄存器:
pCtrOut_Flag_OE映射的物理地址为:0x20350000
pCtrIner_Flag映射的物理地址为:0x20360000
pCtrOut_Flag_B映射的物理地址为:0x20380000
pLED_DAT_OUT映射的物理地址为:0x20390000
核心代码分析
void leddisplay(uint8_t LEDNum,uint8_t data)
{
switch(LEDNum)
{
case 1: *pCtrOut_Flag_B = 0x00; break; // LED_A1=0 LED_A1=0
case 2: *pCtrOut_Flag_B = 0x00| LED_A0; break; // LED_A1=0 LED_A1=1
case 3: *pCtrOut_Flag_B = 0x00| LED_A1; break; // LED_A1=1 LED_A1=1
default: printf(“ERROR!\n”); break;
}
*pLED_DAT_OUT =data; // 输出显示数据
*pCtrIner_Flag_OE =0x00; // LEDCS 位为 0
mdelay(10000);
*pCtrIner_Flag_OE =0x04; // LEDCS 位为 1
}
程序运行结果
- 首先看到 8 个 LED 灯循环被点亮。
- 数码管显示从 99 递减到 00。
源码下载
我上传到我的下载专区了,有需要的自取。