繁体   English   中英

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

[英]Assistance with understanding serial communication (SPI) on the Arduino Mega

因此,我试图将MSP430F5529的一些代码从Arduino转换为C,以操作LCD。 LCD使用SPI进行通信,我对这段代码如何使Arduino与其正确通信感到困惑,并希望具有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都很好,因为它们只是设置为向下的静态引脚,但是SI应该是串行输入,SCLK应该是SPI的时钟信号,但据我所知文档端口28和29没什么特别的,只是通用的I / O端口。

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

这是完整代码的链接: http : //pastebin.com/DxMGJZDu

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

此代码通过位敲击实现了SPI,

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

SPI中 ,当时钟线上的某个边沿发生上升(上升或下降;取决于设备的情况,是否可能)时,接收设备读取数据线的状态。

对于每个位,此代码设置数据线的值,然后将时钟线循环为低电平和高电平。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM