发 帖  
原厂入驻New
[问答] PIC16f1618 SPI通信问题
108 SPI
分享
大家好,我在PIC16f1618上进行SPI通信有困难。目标是在主机到从机之间发送连续字符,反之亦然。我的SPI配置如下:Master:SSPEN:1(Enable SPI)SSPM:0(Fosc/4)CKP:0(空闲状态lo)。CKE:0(空闲到激活)SMP:0(空闲到激活)SMP:0(采样输出中间)SMP:0(采样输出有效)从属:SSPEN:1(启用SPI)SSPM:4(SS启用)CKP:4(空闲状态启用)CKP:0(空闲到激活)CKE:0(空闲到激活)CKP:0(采样输出中间)SMP:0(采样输出中间)主控主控SCL->;RB6SDO->;RB6SDO->;RB6SDO->;RC7SDO>;RC7SDO->;RC7SDO->;RC7SDO>;RC7SDO->;RC&RB4SS->RC6(注意:SS在从机端,即它始终是外围输入)问题:我的问题是在读取数据时不能获得正确的输出数据。为了检查数据,我使用内置的调试器。我如何执行该操作来单击暂停,然后进入我的传输函数,并且当BF位设置为1(在进入两个步骤后设置为1)时看到数据出来。从主控端看,我应该从属端读出“S”,而读出“0”。我没有使用外部振荡器,即使我想,我也不能让调试器工作。因此,我使用的是默认时钟速度为500kHz的内部时钟。我想使用外部时钟的原因是使用内置的延迟函数,因为设置似乎正确,我认为可能有一些定时问题。代码是附加的。请就如何解决这个问题给我一些建议。看起来我没做错,但不知为什么,它已经不能工作了,我已经试着让这个工作了一个月了,应该不会花那么长时间。非常感谢您的帮助。注意:文件名与XC8的MPLab X v4.0.0中的文件名不同。代码确实是建立起来的,所以SpHANDLRC实际上被命名为“SpHANDL.C”,而SpHANDLLRH实际上被命名为“SpHIFfel.h”。
从C.txt(3.69KB)-下载47次SPIHandlerC.txt(8.54KB)-下载79次SPIHandlerH.txt(1.65KB)-下载37次
0
2020-3-11 07:15:21   评论 分享淘帖 邀请回答
19个回答
请注意:使用调试器读取这些寄存器可能会干扰正常的操作:您能以不同的方式检查它们吗?比如说使用串口…
2020-3-11 07:43:41 评论

举报

我试着用最少的硬件和软件来测试。我只想测试通信是否工作,并建议用这种方式测试值。它容易出错吗?
2020-3-11 08:01:08 评论

举报

正如Dario所说,打开一个显示SPI寄存器的监视窗口意味着监视窗口正在与您的代码并行地读取这些寄存器,这将导致问题。监视状态和控制寄存器是可以的,但是不要监视数据寄存器。
2020-3-11 08:10:03 评论

举报

好的,我明白了。然后,我将使用不同的方法显示这些值。谢谢你们俩。
2020-3-11 08:25:03 评论

举报

我现在正在检查用LCD接收的数据。LCD工作正常。在硬件方面,我所做的唯一改变是将SDO从RC7移动到RB5,其中RB5PPS=0x11;//Set SD0移动到RB5,数据表的第175页。然而,从机正在接收NULL数据(十六进制:0x30)。因为它是不可靠的,当从SSP1BUF读取值时,NULL从从属端发送,并在LCD上显示,并带有“*”字样。我知道它是空的,因为我测试数据!=0,然后显示它,不再显示“*”。这是通过调试器确认的(即使检查表上的数据寄存器值不可靠),但是它仍然显示BF标志被设置并且SSP1BUF在那一刻改变到0x30。当检查同一个软件但连接到从机时,我不能让BF标志设置在从属侧。我曾多次尝试过,但没有成功。我还查找过,并发现从属服务器接收空值的常见原因是没有将引脚设置为数字,我已经说过ANSELA=0、ANSELB=0和ANSELC=0。从机只发送一次数据,从主机只读取一次数据并显示在LCD上,仍然没有好运。
2020-3-11 08:30:38 评论

举报

根据默认设置,我总是有点怀疑。你没有为SDI设置PPS。实际上把它设置成RB4可能是个主意。
2020-3-11 08:47:29 评论

举报

跳出的第一件事是MSSP在配置之前被启用。在启用之前配置。
2020-3-11 08:57:46 评论

举报

很难确定将“XXX”替换为“XXXPPS”作为RB4的SDI的外围输入。根据数据表,我不能说RB4PPS,因为这是外围输出的语法,所以我必须使用外设标识符。那么SPI的外围标识是什么?我看了所有PPS的名字,没有一个看起来很合适。我尝试了RB4PPS,它仍然没有我预期的工作,因为IDK的PPS输入的语法,但只是把它放在那里。
2020-3-11 09:13:18 评论

举报

你这是什么意思?SSPEN应该总是设置为1,主和从立即。我做错事了吗?把它们放在1之前。
2020-3-11 09:21:26 评论

举报

在“表13-1:PPS输入寄存器重置值”中,它被列为“SPI和I2C数据”、“SSPDATPPS”。SSPEN应该总是设置为1,主和从立即。我做错事了吗?把它们放在1之前。他建议SSPEN是您配置所有其他SSP细节后应该设置的最后一位。
2020-3-11 09:33:52 评论

举报

你这是什么意思?SSPEN应该总是设置为1,主和从立即。我做错事了吗?把它们放在1之前。阅读数据表第24.2.2节。
2020-3-11 09:47:17 评论

举报

虽然你必须承认,第一句话是误导性的,并不是真的需要在那里。
2020-3-11 10:04:38 评论

举报

但是第二句话消除了所有的疑虑,是吗?;-)
2020-3-11 10:14:46 评论

举报

是的,这就是为什么我认为它应该在那里。新用户阅读第一句话,并认为他们必须先设置SSPEN。
2020-3-11 10:20:07 评论

举报

天啊,我终于明白了。感谢在本帖中贡献的所有人,尤其是qhb。我错过了将时钟设置为主机上的输出的行:TRISBbits.TRISB6=0;//SCL输出pinI禁用SSPEN,然后在最后启用,但是实际上没有改变任何事情。它仍然与以前的方式工作,但是很显然,按照给出的节先禁用是很好的做法,尽管很难通过阅读来解释这正是它们的意思。我还把这个放在master:SSPDATPPS=0x0C;//set SDI中,作为RB4的输入。这个放在slave:SSPDATPPS=0x0C;//s中。ET-SDI作为RB4的输入。SSPCLKPPS=0x0E;//将CLK设置为RB6输入引脚SSPSSPPS=0x16;//将SS设置为RC6输入引脚,但我不确定它们是否在SPI工作的效果中起作用。有时,我得到一个数字0,或者没有显示任何值(它是NULL),或者一个不正确的值,但我通常认为,在大多数情况下,它是有效的。为什么它不工作100%的时间?
2020-3-11 10:26:02 评论

举报

可能这取决于从机或主机是否首先开始运行。有时丢弃接收到的第一个字节会更安全。
2020-3-11 10:37:27 评论

举报

好的,这有道理。我有另一个问题。从属端我发送字母表字母.char字母;int计数器;字母表='a';计数器=0;.(1){alphabet=字母+计数器;junk=char_g_SPIHandler_.(字母);//send data计数器+;}从主端,我接收它,即:._count=0;.(传输);on_count<7){SS_LINE_SIGNAL=0;//使信号变低以选择从属slave_data=char_g_SPIHandler_.('M');//从属读取数据,同时还同时发送数据SS_LINE_SIGNAL=1;u._ms(50);(slave_data);if!= 0) {vd_g_LCDHandler_SendData(slave_data);}._count++;}预期的输出是:abcdefg观察到的输出是:abdgkpvi,我以为可能使主从时钟变慢,但是没用。我还在主机上投入了更多的延迟,而不是_._ms(50),我p1秒后,这个值没有改变,观察的输出。关于这个发生的原因,以及如何获得预期的输出,有任何想法。
2020-3-11 10:52:35 评论

举报

看门狗在奴隶中有残疾吗?
2020-3-11 11:11:46 评论

举报

只有小组成员才能发言,加入小组>>

108个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表