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

标签 c arduino spi msp430

因此,我尝试将一些用于操作 LCD 的代码从 Arduino 转换为 MSP430F5529 的 C 语言。 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

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

最佳答案

此代码通过 bit banging 实现 SPI ,其中

is a technique for serial communications using software instead of dedicated hardware. Software directly sets and samples the state of pins on the microcontroller, and is responsible for all parameters of the signal: timing, levels, synchronization, etc.

SPI ,当时钟线上出现某个边沿(上升沿或下降沿;两者都可能,具体取决于设备)时,接收设备读取数据线的状态。

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

关于c - 帮助理解 Arduino Mega 上的串行通信 (SPI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34215907/

相关文章:

java - 从句子中提取短语的算法

c - 代码中的错误。我不知道它属于什么类别

c - 为什么会出现这个变量错误的错误呢?

arrays - 如何获取字符串数组的大小

c++ - 多个文件中的多个类 - C++/Arduino

javascript - 有没有办法在运行 Windows IoT 的树莓派 2 上使用时钟中断

Java - 运行Python脚本并监视连续输出

自定义应用程序加密

c++ - Qt和Arduino串行通信(读写)

python - spidev/Python 错误