协助了解 Arduino Mega 上的串行通信 (SPI)
Assistance with understanding serial communication (SPI) on the Arduino Mega
因此,我正在尝试将一些用于操作 LCD 的代码从 Arduino 转换为适用于 MSP430F5529 的 C。 LCD 使用 SPI 进行通信,我对这段代码如何导致 Arduino 与其正确通信感到困惑,并希望具有良好 Arduino 经验的人能够解释一些事情(我从未使用过)。最后我在 pastebin 上 link 编辑了整个程序,但这是我现在关注的部分:
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
这是 link 的全部代码: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中,接收设备在时钟线上出现某个边沿(上升沿或下降沿;都可能,取决于设备)时读取数据线的状态。
对于每一位,此代码设置数据线的值,然后循环时钟线的低电平和高电平。
因此,我正在尝试将一些用于操作 LCD 的代码从 Arduino 转换为适用于 MSP430F5529 的 C。 LCD 使用 SPI 进行通信,我对这段代码如何导致 Arduino 与其正确通信感到困惑,并希望具有良好 Arduino 经验的人能够解释一些事情(我从未使用过)。最后我在 pastebin 上 link 编辑了整个程序,但这是我现在关注的部分:
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
这是 link 的全部代码: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中,接收设备在时钟线上出现某个边沿(上升沿或下降沿;都可能,取决于设备)时读取数据线的状态。
对于每一位,此代码设置数据线的值,然后循环时钟线的低电平和高电平。