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

时间:2015-12-11 04:00:57

标签: c arduino spi msp430

所以我试图将一些用于操作LCD的代码从Arduino转换为C转换为MSP430F5529。 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则将PORTA设置为以下3个步骤:

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的时钟信号,但就我而言在doccumentation中可以告诉端口28和29没有什么特别的东西,只是通用的I / O端口。

以下是我所指的端口地图:http://pighixxx.com/atmega2560v3_0.pdf

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

任何建议或更确切地说,任何事情?我正在努力理解这一点。

1 个答案:

答案 0 :(得分:1)

此代码使用bit banging实现SPI,其中

  

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

SPI中,当时钟线上发生某个边沿时,接收设备会读取数据线的状态(上升或下降;这两种情况都可能,具体取决于器件)。

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