完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
HI论坛,试图了解SPI。目前,我已经连接了PIC16F690作为主机和PIC16F87充当奴隶。这两个连接板之间的连接似乎不错,因为我已经设法让一些数据传输去。但是似乎有很多问题,代码并不像预期的那样工作。我的代码是基于:http://ww1.micro..com/...s/en/devicedoc/spi.pdf的。不幸的是,我没有访问示波器进行正确的故障排除。
|
|
相关推荐
19个回答
|
|
|
您没有提到您希望发生什么,以及测试时发生了什么DID。乍一看,主代码看起来不错,但是从代码看起来非常可疑。从代码将把接收到的第一个字节复制到PORTA,但是将垃圾返回给主。在第二次传输时,它将丢弃b。返回值10时收到的字节。然后返回到PORTA,同时返回垃圾。为什么要在这段代码中使用FSR,而直接访问SSPSTAT比较简单?
|
|
|
|
|
|
你好,谢谢你花时间检查代码。我预计会发生什么,存储在计数1中的是发送到从机并输出到PORTA。当计数1增加时,我应该能看到PORTA引脚的高低变化。现在发回给主控器的确实是垃圾,因为这是某种概念验证应用程序,仅用于学习SPI。当前发生的情况是,所有PORTA(除了PORTA,5,因为其SSS被设置为输入)都变高,我认为这可能意味着从设备误解了数据,或者卡住了。看不到范围的实际行为有点棘手。关于FSR。我只是使用了这种方法,因为在上面链接的代码示例中使用了这种方法。我鼓励至少主代码看起来不错。我将继续对从属代码进行故障排除。
|
|
|
|
|
|
我刚才注意到这个行,我认为“020f”应该是“020h”,你不设置基数,所以默认为十六进制。020f将是020fh,这是一个无效的地址。你只有200h的RAM地址可用。如果它返回到0FH,那就把你的抓取RAM放在特殊函数寄存器的顶部。
|
|
|
|
|
|
实际上,前导的“0”会使编译器试图将数字解释为八进制,直到“f”出现为止,在这种情况下,我期望它会抛出语法错误。也许这个值在汇编语言中意味着不同!苏珊
|
|
|
|
|
|
把“0”引到八进制是C约定。MPASM希望八进制是O“#####”。我肯定#h对于六进制是有效的,但是MPASM手册只是说X“##”或0x###(当然,如果十六进制是缺省基数,则根本不带前缀/后缀)[上面看起来奇怪的分行是为了避开愚蠢的论坛防火墙]。
|
|
|
|
|
|
谢谢!尴尬的是,我错过了排版,即使在我经历了所有的代码。修理这个就行了。
|
|
|
|
|
|
似乎仍在与SPI概念斗争。使用相同的,但纠正,如上,我现在可以发送数据从主人到奴隶。然而,返回的字节总是0x00。尝试增加一些小的延迟,以防芯片选择线需要一些时间进行切换。还尝试了几种不同的上拉电阻组合,但没有运气。代码通过SSPSTAT,BF在两边进行检查,所以SSPBUF正在被加载和读取。有人能看到上面代码中的提示吗?为什么从机返回的数据是0x00?
|
|
|
|
|
|
PIC中的“数据总是零”几乎总是指向未切换到数字模式的模拟引脚。在您的情况下,您的主控正在正确地清除ANSEL以将AN0-AN7切换到数字模式,但是您没有触摸ANSELH,所以AN8-AN11仍然处于模拟模式。在16F887中,SSP管脚不与模拟管脚共享,所以在从机中没有遇到这个问题。
|
|
|
|
|
|
由于在主服务器第一次通过循环启动传输(全双工)之前,从从从服务器传输到主服务器的数据必须放在SSPBUF寄存器中,所以发送到主服务器的数据可能不是稍后加载到SSPBUF中的d'10'。不知道这是否在这件事上有所不同。
|
|
|
|
|
|
谢谢!我不知道这件事。它没有解决这个问题,所以我似乎犯了更多的错误,但这是一个强大的故障排除工具。有趣!关于如何同步这两个问题,你有什么建议吗?编辑:删除一些垃圾代码
|
|
|
|
|
|
我认为您仍然误解了整个传输。它们总是同步锁定,由主控器控制。每个SPI传输都是数据主控器到从控器的同时传输和从控器到主控器的同时传输。当主控器写到它自己的SSPBUF寄存器时触发。从控器必须已经写过。在此之前,有些东西要放到它自己的SSPBUF寄存器中。当从服务器看到BF已满时,它知道发生了传输,应该读取SSPBUF并写入下一个要发送的字节。
|
|
|
|
|
|
你已经添加了BF旗的冗余检查,为什么?在MASTER中,BF标志指示传输何时完成,因此也指示接收(全双工操作)(中断标志实际上更适合使用-IMHO)。在从属中,BF标志指示接收完成,因此也发送(仍然是全双工操作)。请记住,根据定义,数据同时在两个方向上传输,当传输完成时,接收完成(在SLAVE中反之亦然)。SS信号将从机同步到主机,SS的下降沿重置从机中的时钟计数器,以便它准备在下一个时钟上从主机接收第一位。从SSPBUFSS引脚HIGH接收数据(对数据做或不做某事)再循环一次。在SLAVE:加载传输数据到SSPBUF等待接收完成(BF或中断标志)从SSPBUF读取接收数据(对数据做某事或不做某事)再循环一次。
|
|
|
|
|
|
你不需要同步,把数据放在主SPI缓冲区来启动主和从之间的交换。从机已经在预装入中加载了。您真正需要的是从机可以理解的协议,以便从机可以等待命令。它还可以返回错误。假设您想要从机读取内存。您将发送SLAVE_GET_MEM。从属服务器的以下数据是内存,取消命令将取消它。M:发送SLAVE_GET_MEM、地址、size_tM:for x=0到10读spS:.(Command)等……这就是您所做的。
|
|
|
|
|
|
谢谢大家。我错过了SPI的传输部分。想一想,在你解释后我现在就明白了。还有一个问题,就是我只能读从主到从的数据。对于这个实现,我还是有点误解。主-使用USAT到MIDI进行故障排除。(我检查过,这不是问题的根源。当加载带有值的TxReg时,它传递精细。
|
|
|
|
|
|
不确定你在这里说什么,如果主从没有使用SS,那么主从有可能“不同步”(丢失的时钟等)并且接收的字节将不正确(它们将被移位一个或多个位)。在一个完美的世界里,两个人将永远保持同步,没有完美的世界。
|
|
|
|
|
|
这意味着什么?难道你没有从主人那里得到你对奴隶的期望吗?你收到了什么?
|
|
|
|
|
|
似乎我收到了0的文件,不管我用什么样的值来加载SPBUF。有什么误解我的想法吗?
|
|
|
|
|
|
让我们回到基础。你能看到任何东西在PAN-13/SDI上到达你的主人吗?如果你把那个引脚连接到5V,你仍然只能得到0x00吗?
|
|
|
|
|
|
谢谢!很好的建议。测试后,SDI引脚出现了与无焊板的连接问题。在将16f690移动到一个新的位置之后,如果将5V应用到引脚,我现在在主SSPBUF中得到0xFF,但是仍然不能得到加载到从SSPBUF中要传输的任何值。我在16f690SDI管脚上放了一个万用表,而且有很多活动,所以看起来确实有一些数据正在传送。我怀疑在初始化SPI或在从机中加载SSPBUF时我做错了什么,但是我看不出来。有什么我可以检查的吗?我用同样的代码给奴隶。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
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
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 23:50 , Processed in 0.954471 second(s), Total 109, Slave 92 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1735