当前位置: 首页 > 知识库问答 >
问题:

帮助理解Arduino Mega上的串行通信(SPI)

鞠子轩
2023-03-14

因此,我试图将一些用于操作LCD的代码从Arduino翻译为MSP430F5529的C。LCD使用SPI进行通信,我不清楚这段代码是如何使Arduino与之正确通信的,我希望有经验的人能够解释一些事情(我从未使用过)。最后我链接到了pastebin上的整个程序,但这是我现在关注的部分:

void comm_out(char c)
{
  int i;
  digitalWrite(CS, LOW);
  digitalWrite(AO, LOW);
  for(i=0;i<8;i++)
  {
    if((c&0x80) == 0x80)
    {
      PORTA |= 0x80;
      PORTA &= ~0x40;
      PORTA |= 0x40;
    }
    else
    {
      PORTA &= ~0x80;
      PORTA &= ~0x40;
      PORTA |= 0x40;
    } 
    c = c<<1;
  }
  digitalWrite(CS, HIGH);
  digitalWrite(AO, HIGH);
}

因此,我理解任何与将Arduino上的一些数字管脚设置为高或低有关的代码(看起来它们只是输出,因为程序从未为它们设置方向),因为这是非常直接的,但我不太明白for循环在SPI方面做了什么。

我直接得到函数正在做的事情。它得到一个8位的输入,确定它是一个字符(虽然这并不重要),并检查第一位是1还是0。如果是1,则通过3个步骤将PORTA设置为以下值:

1:1xxx xxxx 2:10xx xxxx 3:11xx xxxx

如果为0,则分3步将PORTA设置为:

1:0xxx xxxx 2:00xx xxxx 3:01xx xxxx

然后,它移动输入,使下一位最高,并再次进行检查,直到其全部8位都已检查。但我不知道这对Arduino做了什么,使其能够通过串行通信与LCD正常通信。从我查阅的所有文档中,我甚至无法确定什么是PORTA。我曾假设它可能被映射到某种串行通信模块,但它似乎不是这样。

我感到困惑的另一件事是顶部的声明

int SCLK = 28; // SCL signal connected to digital pin 28 of Arduino Mega     
int SI = 29; // SI signal connected to digital pin 29 of Arduino Mega     
int CS = 30; // CS signal connected to digital pin 30 of Arduino Mega     
int RES = 31; // RES signal connected to digital pin 31 of Arduino Mega     
int AO = 32; // A0 signal connected to digital pin 32 of Arduino Mega

A0、RES和CS都很好,因为它们只是为down设置的静态引脚,但SI应该是串行输入,SCLK应该是SPI的时钟信号,但据我在文档中所知,端口28和29并不是什么特殊的,只是通用I/O端口。

这是我指的港口地图:http://pighixxx.com/atmega2560v3_0.pdf

下面是整个代码的链接:http://pastebin.com/DxMGJZDu

有什么建议或者更确切地说,有什么建议吗?我正在努力理解这一点。

共有1个答案

裴理
2023-03-14

这段代码实现了带位碰撞的SPI,这

是一种使用软件而不是专用硬件进行串行通信的技术。软件直接设置和采样微控制器上引脚的状态,并负责信号的所有参数:定时、电平、同步等。

在SPI中,当时钟线上出现某个边缘(上升或下降;根据设备的不同,两者都有可能)时,接收设备读取数据线的状态。

对于每个位,该代码设置数据线的值,然后循环时钟线的高低。

 类似资料:
  • 问题内容: 我具有以下实体结构:业务->广告活动->促销,其中一个业务可以有多个广告活动,一个业务可以具有多个促销。一对多关系都声明为LAZY。在我的代码中的一个地方,我需要从业务部门急切地获取两个集合,所以我这样做: 但是,查询返回的结果列表中包含4个业务对象,所有4个对象都引用同一个业务实例。在我的数据库中,该公司下有3个广告活动,而这3个广告活动下都有3个广告活动。 我有两个问题: 首先,我

  • 我目前正在做一个项目,我们必须从UML图制作代码。我了解UML类图的解剖结构,但我无法理解什么

  • 问题内容: 我正在Linux上的串行端口上实现协议。该协议基于请求应答方案,因此吞吐量受将数据包发送到设备并获得应答所花费的时间限制。这些设备主要基于Arm,并且运行Linux> = 3.0。我无法将往返时间缩短到10ms以下(115200波特,8个数据位,无奇偶校验,每条消息7个字节)。 哪些IO接口将为我带来最低的延迟:选择,轮询,epoll或使用ioctl手动轮询?阻塞或非阻塞IO是否会影响

  • 色彩管理系统可以统一不同设备之间的颜色差异,使您能够可靠地预测系统最终生成的颜色。正确的查看颜色使您可以在从数字捕捉到最终输出的工作流程中使用口述颜色定义即可。通过色彩管理,还可创建基于 ISO、SWOP 和 Japan Color 打印生产标准的的输出。 为什么色彩有时候不匹配 在出版系统中,没有哪种设备能够重现人眼可以看见的整个范围的颜色。每种设备都使用特定的色彩空间,此色彩空间可以生成一定范

  • 我在云中有一个节点运行的java服务很少,比如logstash、newrelic collector等。几天后,我看到其中一个服务死了。var/log/messages表示如下 newRelic-xms256m-xmx1024m(2个实例)logstash-xmx500m其他java服务:-所有5个服务都配置了-xms256m-xmx1024m 因此,基于此配置,总服务被配置为使用系统拥有的更多内

  • 本文向大家介绍深入理解mysql帮助命令(help),包括了深入理解mysql帮助命令(help)的使用技巧和注意事项,需要的朋友参考一下 在安装、管理和使用mysql过程中,你是不是需要记忆很多的mysql命令。而且对于新手来说,很不多的命令不知道该如何应用,对于老手来说很多命令时间长了忘记具体的用法。 其实mysql的帮助信息,已经给我们提供很全面的使用方法。 下面我就大致介绍下,如何使用my