完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
你好,我想通过SPI发送8位音频数据到MCP4902DAC。我有一个镜头,但我没有从DAC得到任何音频。我正在努力了解SPI安装程序是如何工作的。这就是到目前为止我所知道的:一个定时器中断,它使用系统时钟计时1/48000秒,以便设置48000Hz的音频SR。那个中断功能的主体启动了音频信号生成和音频输出。然后我有了SPI设置功能,我不确定它是否正确。我从参考手册中提取了示例代码,并做了一些修改以满足我的需要:KontrolRate_Monitor()函数生成音频,AudioSampleOut.()函数每1/SR秒向SPI1BUF发送一个音频示例。我已经对代码的这些部分进行了大量调试,并且知道在将数据保存到SPI1BUF之前和包括数据保存到SPI1BUF之前都工作得很好。这很好,除了我已经用我的定时器中断来计时我的音频输出周期。那么我需要SPI中断吗?我应该放弃定时器中断,而我的程序从SPI计时器,而不是?抑或SPI中断是指SPI缓冲器中的每个数据位的输出时间?从阅读SPI参考手册,第4章,听起来好像只要您将一些数据保存在SPI1BUF中,SPI传输就开始了,并且除了正确设置之外,不需要从我这端进行任何操作,对吗?我也尝试过启用SPI中断,但是目前它只是激活默认的中断并陷入空while循环(因为我没有为它编写中断)。
|
|
相关推荐
16个回答
|
|
|
是的,有一个SPI中断,不,你不需要使用它。事实上有2个:一个取决于在西塞尔位中设置的条件,另一个是如果有错误。在你的情况下,我不想使用SPI中断,因为计时应该来自定时器。但是,如果你没有,那么你需要检查缓冲区中是否有空间。MCU有一个可选的FIFO(你似乎没有使用),但是你应该经常检查有没有空间。在你的情况下,只要你足够快地完成交换,以便在交换之间有空间,那么就不会有问题。SPI外设(在主模式下)一旦你写入缓冲区(或者一个值从FIFO移到缓冲器),就会开始交换。我建议您在SCK和SDO行上设置一个范围,以查看这种情况是否正在发生。(SPI1是硬连接到MCU上的引脚,所以应该很容易)但是,这并不一定是整个故事。如果从服务器需要一个 CS 线低,以使芯片,那么你将需要这样做之前,你开始交换。此外,您需要等到Exchange完成之前,才能提高c线(假设只有一个值需要交换)。为此,您需要阻止或是当估价器已经被读取时,SPI中断的一个很好的地方-您希望看到这一方而不是Tx端,因为当Exchange已经完成时,这将是。我不建议阻止,因为函数是从ISR和I调用的。阻塞ISR通常是个坏主意。在这一点上,我有点担心您的“KontrolRate_Monitor”函数是否生成音频值。这可能需要一些时间,并且可能会造成混乱。作为一个建议(我已经使用了多次),您可以尝试设置双缓冲区安排,并使用DMA将缓冲的数据传输到SPI外围设备。定时器可以触发DMA通道,为您提供常规示例,并且可以使用DMA中断切换缓冲区。这样,当另一个正在发送时,您可以填充一个缓冲区,并且让硬件在不需要您干预的情况下处理整个传输过程。
|
|
|
|
|
|
谢谢你的回复!我的互联网已经坏了,所以我在没有正确访问文件的情况下,从我的手机发送这个。我会尽快给我更多的实际功能发邮件。我意识到我没有正确地将麦克风按在附在面包板上的头针上,所以我现在实际上正在从DAC收到某种信号,但这不对。如果我去掉了对SPI1BUF的写入,DAC就不会产生噪声,所以对SPI1BUF的写入实现了一些东西。我已经看过您说的几件事,回过头来看看数据表和SPI参考以及MCP49x2数据表,并清理了一些东西。还有一些问题。首先,CS线。由于某些原因,由于我的电路站,我的SDI引脚连接到DACS CS引脚。我从一些在线教程中得到了我的电路,但这似乎不太正确。我想这可能是对的,因为我不需要SDI PIN,是吗?DAC不向微控制器发送信号。无论如何,在发送数据到SPI1BUF之前,我正在清除SDI管脚,但是同样正在发生(可能是因为管脚开始被清除)。其次,我重新启用了SPI中断。你建议使用它在传输后再次提高CS线。那是中断的时候吗?我找不到任何确定SPI中断被调用的设置。如果只连接一个奴隶,是否需要增加CS密码?还是我要把它清理干净?虚构的读物是做什么的?这只是为了检查SPI缓冲区中的内容吗?我已经调试并检查了正确的信息被保存到SPI1BUF。不过,我还检查了在下一次写之前的缓冲区中的内容,它仍然是一样的。数据一旦发送,它就应该是空的吗?皮特
|
|
|
|
|
|
再高调的嗡嗡声——你能把它从哪里分离出来吗?由SDI线引起的对MCU的再损坏-我怀疑这一点。SDI线是一个输入,这意味着该引脚的TIS设置将是“1”。当数据锁存器的输出从管脚断开时,写入这个管脚的LAT(甚至PORT)寄存器没有任何作用(参见数据表中的图11-1)。在不操作CS行的情况下重写到SPIxBUF——在主模式下完全可以这样做。在主模式下,SPI外围设备不使用SS行,并且一旦您写入SPIxBUF寄存器,交换将立即开始。这可以让你做一些事情,比如在一个事务中执行多个交换(如c\行所定义的低)。[我曾经使用过另一个制造商的设备,它试图“智能”地为您控制CS线路——只要缓冲区中有东西可以把线路保持在低位。控制是一场噩梦!重读西塞尔比特的文档——你从哪一个文档中读取的?您的芯片的数据表没有脚注(DS70000657H,第268页,寄存器18-1),并且芯片确实具有增强的缓冲能力。另一方面,用于该家庭的SPI外围设备的FRM部分(DS7000 05185A,第6页,寄存器2-1)确实如此。您需要小心使用FRM部分,因为它们应用于许多不同的设备,并且可以对出现在某些设备中但未出现在其他设备中的功能进行注释。因此,数据表是权威指南。另一方面,FRM确实提供了额外的信息,并且通常提供了非常有用的示例——只要您用您所拥有的设备的实际能力过滤它们。苏珊在董事会的领导下创造了短线。
|
|
|
|
|
|
关于增强缓冲器,你是对的。我在读SPI特定的文件时,我读到了。高调的嗡嗡声是来自DAC输出的噪声。我用我的万用表测量它(刚刚发现它自从我移动),它似乎只有高达0.04V…因此,这可能是目前可接受的噪声水平。我现在已经摆弄了一堆东西:SPI设置,以8位的两个段而不是1 16位的传输来传输数据,使用或不使用提高CS线路来传输数据,降低采样率以查看我是否要去。为了加快DAC的传输速度,无论是否使用SPI中断(如果我不使用CS线路,实际上我不认为我需要SPI中断,因为它的唯一目的是在传输之后提升该线路),我已经通过程序确保正确的数据被发送到SPI1BUF,确保数据是正确生成的……从我的代码中可以看出,它应该工作。我所做的唯一一件改变很大的事情是:1)当我改变为2x 8位传输时,DAC输出上的高音调嗡嗡声变得非常安静。我不知道为什么,从阅读DAC的数据表,它听起来很像它可以接收16位传输。我遇到的每一个教程,将传输分成2×8位…有没有想过这对我来说是必要的?正如你知道的,我知道你必须把SPI设置为16或8位模式。2)当我改变采样率时,高音调的嗡嗡声也改变了频率。我知道这是显而易见的,但也许值得一提。它显示了一些事情正在发生,即使它不是我想要的。当我改变振荡器的频率时,它不会改变。当我不给SPI1BUF写信时,噪音也停止了,所以,因为我正在发送数据……因为面包板,我不认为我应该买短裤,因为它是新的,但我不能排除它。我应该测试一下电缆,以确保它们都在工作,如果其他的都失败了,也许我应该把整个东西粘在另一块板上。你认为如果我再张贴一些代码会有帮助吗?或者是给我一个电路图?非常感谢您的继续帮助!!!!皮特
|
|
|
|
|
|
只是快速查看了MCP4902数据表。您将需要按照5.2节使用CS行,因为该行告诉DAC何时接收到新的命令/数据序列。是否使用2×8位或1×16位序列取决于您,只要您将CS行保持在8位值之间。因为DAC是从机,所以它只关心时钟脉冲(以及从图1-1和图5-3中,只有时钟脉冲的上升沿)何时到达,只要它们的时钟频率小于20MHz。时钟信号的中断将是透明的。您是否总是向每个DAC通道发送相同的值?如果你当时不应该有任何嗡嗡声。(我假设您有一个扬声器或类似的连接到DAC输出引脚。)您是使用LDAC引脚触发双缓冲和同时更新的频道,还是绑定这个低?(更正确的问题之一)面包板是电线可以穿透塑料部分和短路。这与年龄无关。您是否尝试过简单地使用单个值与DAC通道(或者甚至只有一个通道)通话并检查输出电压?至少这将验证与DAC的通信工作,并且您可以选择特定的电压。一旦你知道基本原理是正确的,再加上所有其他的控制编程,苏珊。
|
|
|
|
|
|
好啊。。。我刚刚发现了一个几乎肯定是问题的问题(或者至少是一个非常大的问题!)我以为我正在给DAC和VREF供电,它们来自dsPIC上的VDD引脚(我猜想微针II正在从USB向该引脚发送电力,所以我也可以用它向DAC发送电力)。我刚从那里测过电压,我的万用表上什么也没有显示出来。有没有想过为什么会这样?我只是测试了板上所有的电缆和电阻器,所以不是这样。我还重新安排了配电板,这样就不会太容易短路了。而且,如果我直接把万用表触摸到dsPIC上的VDD引脚上,然后像那样连接到电路的其他部分来测试电压,对dsPIC来说安全吗?最后,我已经尽我所能简化了我的代码。假设其他一切正常,工作正常,那么我认为,这四行代码将正确地处理单个SPI传输,对吗?
|
|
|
|
|
|
你为什么要玩弄三位一体?这是方向控制。您应该在启动代码中将其设置为输出,然后操作LATBbits.LATB6将其设置为高或低。
|
|
|
|
|
|
哎呀!当然。好吧,这不会有帮助吗?这将解释为什么从原始代码中移除它们不会停止DAC输出中的高音调嗡嗡声,而当移除对SPI1BUF的写入时却停止了它。尽管如此,仍然没有得到信号……我应该能够通过MICROSTICK II读取与VDD连接的面包板导轨上的电压吗?
|
|
|
|
|
|
我也要指出这一点,但有点不适。
|
|
|
|
|
|
要是我早点读你的签名,我现在就可以把它分类了,所以我注意到有点奇怪。我说过,如果我把万用表从dsPIC上的VDD串联到配电板上的电源栏,那么我就没有测量电压。然而,如果我在dsPIC上也直接挂上VDD,然后有一根电缆从电源线通向万用表,万用表连接在dsPIC上,我就读出电压!为什么会这样?对我来说,唯一有意义的方法就是如果电源在任何地方都没有正确连接到DAC,并且因此没有流量,除非我把它短路到地面……我怀疑这件事是对的吗?我已经检查和再检查了我的电路,并测试了所有的电缆和电阻器,它们都工作得很好,所以我看不出为什么会这样……
|
|
|
|
|
|
好的,我不知道是否有人在这里,我敢肯定我现在一定让你很紧张,哈哈(DAC这件事肯定让我很紧张!)我又用了我的万用表了。我在所有合适的地方测量电压。有电压进入VDD和两个VREF,接地在所有相关位置都连接,有电压显示在SCK线上,当我不发送消息时CS线电压很高,当我发送消息时显示相当低的电压,当我发送消息时数据线显示电压。M发送数据。我希望我能用万用表测量频率,这可以帮助我更好地理解这些线路上的情况,我最好尽快买个新的!我发现,随着我初始的复杂程序不断地向DAC发送数据,我直接从VOUTA获得大约4V(这是我听到的高音调嗡嗡声)并且VOUTB上没有电压……但我想用我的SPI消息来解决哪个DAC并不重要,它总是VUTA上的电压而不是VUTB…直到我停止发送消息,两个消息都没有电压。在我的简化版本中,我只是发送一个高电文给DAC A,我在VOUTA或VOUTB上读取没有电压,但我猜它应该保持高电文直到下一条消息,对吧?所以,我想我现在决定我的电路是好的,但我的程序显然不是。因此,我将在下面列出代码的所有重要部分,包括你们任何人都可以发现错误或者我遗漏的东西:主要功能:配置位:配置振荡器:PIN设置:SPI设置:
|
|
|
|
|
|
不要用万用表测量信号,它会让你发疯的。使用作用域(最好是数字和/或存储作用域),这样您就可以看到实际的电压以及它们如何相对于彼此变化。在配置设置中,是否关闭了JTAG选项?在SPI配置中,我看到您没有使用中断(良好),并且处于标准缓冲模式。但是,在提高SS行之前,您正在等待SPITBF位的清除。这样做的问题在于,当值从缓冲区移动到移位寄存器时,SPITBF位被清除,而当传输完成时不清除。我建议您查找在交换完成之后正在设置的SPIRBF位。我猜正在发生的是SS在交换进行中时正在被提升,而MCP4902只看到值的开始,并且可能试图解释该值。因为SPI交换首先是MSB,所以DAC可能看到比特-15的值0,它告诉它使用信道A,并且您看到那个信道提供了输出。事后看,我不知道。苏珊
|
|
|
|
|
|
我尝试过读取SPITBF(我误解了这种方式,认为这是在接收数据时使用的),并且在配置设置中禁用了JTAG选项……我还没读到DAC的任何东西…上帝,这是令人沮丧的。怎么会这么难?可悲的是,我没有一个范围,没有足够的钱买一个现在,除非你有任何便宜的,你可以推荐。
|
|
|
|
|
|
你能试试轮询SpBBF吗?至于范围:https://it.ali..com/item/1pc-DIY-.-Oscilloscope-Kit-osciloscopio-Electronic.-Kit-DSO138-kit-2-4-1Msps-u***-hand./32668438328.html?SPM= 211413010607.0.0.3JoqpWIt是很好的
|
|
|
|
|
|
谢谢!我以前没想到过那种示波器。这绝对在我的预算之内!你说“轮询”SpBBF是什么意思?你是在说阅读而不是SPITBF吗?或者你的意思是做一些与SHBBF不同的事情?我只是试着阅读它来确定是否发送了消息,而且我的DAC的输出仍然没有电压。
|
|
|
|
|
|
有没有人可以给我发送的简单代码示例,让他们知道应该正确地将消息发送到MCP49xx DAC?如果我能尝试一些人已经确认的代码,它将帮助我缩小我的问题所在。现在,我不知道是电路、芯片还是代码(尽管我已经彻底测试过电路,并且我确信凭借有限的电子经验,情况并非如此)。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1122浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
872浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 22:47 , Processed in 1.163167 second(s), Total 102, Slave 85 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
5268