树莓派4B控制飞利浦音源芯片SAA1099P电路设计及Python编程

       树莓派的最大优势是社区生态好,可以说网上关于如何点亮人生第一灯或者更复杂点电路设计应用太多现成例子比如智能小车摄像头识别等机器人控制等等似乎拿来就用,特别适合具备SPI,I2C,UART等总线结构的电路和模块的学习开发和应用,对于51,stm32包括树莓派这类GPIO都有现成的接口对接,容易找到现成电路设计和编程例子供参考,就是数码界传说的编程都靠CV(复制粘贴)吗?\n\n       而我想做的电路设计,也是常见8位数据总线结构的芯片,竟然难以找到例子可以学习借鉴更别说复制粘贴拿来就用了,只能自己边学边融会贯通举一反三。通过不断设计和实验,我用树莓派4B控制SAA1099P音源芯片的电路设计和Python编程成功实验发音,就等于实现了对于所有带有8位数据总线结构的芯片和电路的双向控制读写数据的实验和应用目的。

 f43bccfdce0048589076df826156cb94.jpg

 22e7562b8cc64365a6154459540b45b6.jpg

e2b05f86498a4bceb1e3bc69ce3f776a.png 

      这里发布如何用树莓派4B4G实现控制飞利浦音源芯片SAA1099P发音的电路图。该芯片在网上可以买到,详细资料在网上可以下载(英文版),部分中文技术资料翻译如下:\n\n        SAA1099是一款单片集成电路,微处理器控制的立体声声音发生器用于音效和音乐合成,\n设计用于产生立体声效果和音乐合成器。\n        特征:\n        每个发生器八个倍频程,六个频率发生器每倍频程256个音调,两个噪声发生器,6 个噪声/混频器,12 个振幅控制器,两个包络控制器,两个 6 通道混频器/吸电流模拟输出级,兼容 TTL 输入,易于连接至 8 位微控制器,最少的外围组件,简单的输出滤波应用消费类游戏系统,家用电脑,电子琴,街机游戏,玩具,报时/闹钟     快速参考数据        电源电压(引脚 18),断续器,典型值5V\n电源电流(引脚18)典型值70 毫安      频率发生器       六个频率发生器每个可以选择一个八度内的8个八度音阶和256个音调之一。总频率范围为 31 Hz 至 7,81 kHz。输出还可以控制噪声或电子元件发生器。所有频率发生器都有一个使能位,可以打开和关闭它们,从而可以预先选择音调并在需要时使其听不见。频率发生器可以使用频率复位进行同步。\n每个倍频程的频率范围为:      倍频程频率范围\n031 赫兹 至 61 赫兹\n161 赫兹至 122 赫兹\n2122 赫兹至 244 赫兹\n3245 赫兹至 488 赫兹\n4489 赫兹至 977 赫兹\n5978 赫兹 至 1,95 千赫\n61,96 千赫 至 3,91 千赫\n73,91 千赫 至 7,81 千赫\n        噪声发生器\n        两个噪声发生器均具有可编程输出。这可能是通过频率控制发生器之一的软件控制噪声,也可以是三个预定义噪声之一。频率发生器在控制噪声发生器时不会发出音调。产生的噪声基于频率发生器输出的两倍,即61 Hz至15,6的范围 kHz.In 选择预定义噪声的事件,噪声发生器0的输出可以与频率发生器0,1和2混合;噪声发生器1的输出可以与频率发生器3、4和 5.In 混合,以产生等电平的噪声和音调输出(当两者混合时),音调的幅度增加。三种预定义的噪声基于7,8 kHz,15,6 kHz或31,25 kHz的时钟频率。\n噪声/混频器\n       6 个噪声/混频器,每个混频器有四种选择\n·通道关闭\n·仅频率\n·仅噪音\n·噪声和频率\n每个混频器通道都有一个频率发生器输出馈电\n        振幅控制器\n        来自混频器的六个通道输出中的每一个都被分成一个左右分量,从而有效地提供了十二个幅度控制器。为每个十二个信号分配16个可能电平的幅度。通过这种配置,只需改变振幅成分即可实现立体声效果。将声音从一个声道移动到另一个声道时,每个音调只需要对振幅寄存器内容进行一次更新。\n使用包络发生器时,振幅级别受到限制。然后,可用的级别数减少到八个。这是通过禁用幅度控制的最小有效位(LSB)来实现的。\n\n来自微处理器控制立体声发生器\n用于音效和音乐合成\n包络控制器\n六个音调发生器中的两个处于包络控制之下。这适用于音调发生器的左输出和右输出。\n包络具有以下八种可能的模式:\n振幅为零\n单次攻击\n单次衰变\n单攻击衰减(三角形)\n最大振幅\n持续攻击\n连续衰减\n连续攻击衰减\n包络控制器的时序可通过其中一个频率发生器进行编程(参见图 1)。当为通道选择包络模式时,通过向下舍入到最接近的偶数电平,该通道的控制分辨率将从16级减半到8级。\n还能够控制通道的“右”分量,与“左”分量相反,该分量保持编程状态。\n直接使能允许定义包络的开始,并且还允许随时终止 anenvelope。包络速率可以由频率通道(见图1)控制,也可以由写入地址缓冲寄存器的微处理器控制。如果控制的频率通道为OFF(NE = FE = 0),则包络线将出现在输出端,这提供了替代的“非方形”音能。在这种情况下,频率将是包络速率,如果速率来自频率信道,则最大为1 kHz。通过将包络分辨率从16级减半到8级,可以获得高达2 kHz的更高频率。报价基于 8 MHz 时钟的输入。\n六通道混频器/吸电流模拟输出级\n六个通道由两个混频器混合在一起,允许每个通道控制六个等量程电流吸收器之一,以提供七电平模拟输出。\n命令/控制选择\n为了简化微处理器接口,命令和控制信息是多路复用的。要选择寄存器以控制频率、幅度等,必须加载命令寄存器。该寄存器的内容决定了在下一个控制周期中将数据写入哪个寄存器。如果需要持续更新控制寄存器,则只需写入控制信息(命令信息不会更改)。如果命令/控制选择为逻辑0,则字节传输为控制,如果A0为逻辑,则字节传输为命令。\n微处理器接口\n是基于IO外设的数据总线,根据命令/控制信号A0的值,CS和WR信号控制着从微处理器到该芯片的数据传输。数据传输确认DTACK表示数据传输已经完成。在写入周期中,当微处理器识别DTACK时总线周期将由处理器完成。\n应用信息\n设备操作\nSAA1099使用脉宽调制来实现幅度和包络水平。在离开芯片之前,十二个信号以模拟格式(6个“左”和6个“右”)混合。幅度和包络信号以62.5 kHz的最小速率斩波输出,而最高音调输出为7,81 kHz。简单的外部低通滤波用于去除高频分量。\n报价基于 8 MHz 时钟的输入。\n基于数据总线的只写结构用于加载板载寄存器。数据总线用于加载寄存器的地址,随后将数据加载到该寄存器。加载地址后,可以执行多次数据加载到该寄存器。\n地址或数据的选择由单个地址位A0进行,如寄存器图表1和表2所示。\n总线控制信号WR和CS设计为与各种微处理器兼容,包括DTACK输出以优化与S68000系列微处理器的接口。在大多数总线周期中,DTACK将立即返回,这适用于所有寄存器地址加载周期和所有幅度数据加载周期。关于幅度数据,可能需要执行多个等待周期,具体取决于自上一次幅度加载以来的时间。DTACK 将指示所需等待的次数。

……

(更多详细原文:“https://www.datasheet5.com/”查找SAA1099P)

       其实理解学会这类音源控制的芯片难度,可能比学习入门树莓派难一点,因为没有前面借鉴没有硬软件例子,全靠硬碰硬去深入解读分析芯片资料的每一个信息,特别是关于芯片的寄存器读写数据!更别说能够很好地理解和应用其中的包络线控制,但是天下无难事只要有心人。如果我采用这种音源芯片来作为深入学习开发树莓派的应用,就肯定能够跳出初学者入门的所需要的费时费劲的各种国内外源下载安装,好不容易要开始学习硬软件开发阶段时,发现除了各种点灯还是点灯,学习的误区和前面的坑一个又一个。点灯几次就腻味了。总感觉专家和老师为我们初学者精心设计了许许多多学不完的课程踩不完的坑,有的初学者还抱怨自己甚至都不清楚学习树莓派,学习Python编程到底有啥用?我也需要立马跳出初学入门的恶性循环,给自己一个明确目标-边学边设想做出自己需要的电路设计和Python语言编程。如此经过亲自设计和编程实战,对于深入学习和开发树莓派反而就容易多了!

       对于这类带有8位数据总线结构的音源芯片电路,要实现用树莓派4B来控制还不是简单的GPIO接线。首先必须明白树莓派采用GPIO输入输出接口,内含SPI,I2C,UART等与外电路的数码接口。不具备对于8位并行数据总线结构的芯片和电路的直接连接,对于类似该音源芯片,采用D7-D0的8位双向数据总线作为输入输出数据控制结构的,需要通过类似串转并和并转串的的接口电路方式,来实现此类芯片的8位双向数据总线结构的控制。

       基于此思路,我设计采用74HC595实现串转并,将树莓派的GPIO13脚端(作为串入信号的输出,给595芯片DS端输入串入二进制数据,经过8次串入信号的数据,就变成8位BIT的标准8位数据了,就是树莓派GPIO13脚把内部8位标准数据分解成为一个又一个的二进制串行信号输出给595芯片,595芯片内部就自动把串行数据还原变为并行的8位数据,就可以被该音源芯片SAA1099P的8位数据总线读取控制芯片寄存器所需要控制和写入的8位数据。

       当然也可以对该音源芯片内部寄存器数据进行读取,就需要把读取的并行数据也转换为串行数据,才可以被树莓派的GPIO输入,就是用另外一片与74HC595芯片功能相反的并转串芯片74HC165,实现并行数据转为串行的数据,就能被树莓派的GPIO脚接收。由于74HC595芯片的8位输出数据总线与74HC165芯片的8位输入数据总线端口都具备三态门高阻抗特性,所以,电路设计就可以把74HC595,74HC165,SAA1099P 这三种芯片的数据总线,甚至是其它更多类似带8位数据总线结构的芯片,都直接互相连接在一起,再通过片选/OE,/CS,/CE等控制端,根据片选时序图确定触发控制信号,就很容易对于数据的输入输出控制而不会互相干扰影响。

       其实,对于74HC595串转并芯片和74HC165并转串芯片,网上也有许多应用例子,比如74HC595主要用于点亮LED数码管,74HC165主要用于接收处理键盘开关信号。我只需要把这二片IC结合一起,就成为可以控制所有具备8位数据总线结构的芯片和电路的经典设计实验。

       如此举一反三,对于所有需要八位或者16位数据总线输入输出控制的任何芯片和电路设计都不再难题!

1a24bb50145142f7975729c463908b93.png

Python编程:

2dd8a350dd7a4fd991423c86342131f1.jpg

c95ad9f508114d419b74596659439936.jpgf567b34dd2ad4d97a4df87c4c00179cb.jpg 

 

23205210a89c4b358443c9b4d93a8497.jpg

a8c41db03b454f0da3a4e4d9da0a2f9f.jpg 908ba88ff6c8425ebb3b05ee95f66a08.jpg

       目前只是初步实验,用该音源芯片能够发出了单音音乐一曲《小星星》,当然也能发出六音同时响的钢琴曲。因为开发音乐芯片发音最重要的五线谱编解码有了,音乐编程,先编一个发单音的小曲子。该芯片可以有六个音同时发音,实现任何曲子编程就有了基础。

       后面继续开发新的实验,需要增加多声道多音程,需要设置一个节拍振荡器产生音乐节拍,设计定义和编制一个可编程定时中断服务程序,而Linux的Python语言,使得我可以轻而易举地引入定义一个多线程threading,用来产生节拍振荡器和定时中断。

       该多音程多线程Python编程仍进行中……。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贵州龙家镇洞堡村

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值