在这里,您可以了解Arduino Shippin如何运作以及它有多快。这
主要用于从并行接收串行输入的功能
串口芯片例如74HC165(8位)。这允许您增加
仅使用两个处理器引脚的处理器的输入数(您可以
菊花链芯片甚至更多的输入)。
许多芯片使用串行接口来减少物理的数量
引脚,因此而不是使用并行处理器总线传输数据8或
一次16位,两个信号(时钟和数据)获取数据
设备,一次一点。
arduino. Shiftin()使用两个信号引脚(数字输出引脚,以及
数字输入引脚 - 即几乎任何Arduino引脚)并生成一个
输出上的时钟信号,并在输入上接收数据,使用
DigitalRead()函数。
arduino. Shippin的源代码包含在Wiring_shift.c中。路径是:
C:\ Program Files \ Arduino \硬件\ Arduino \ Avr \ Cores \ Arduino \ wiring_shift.c
注意在Arduino.h中定义LSBFirst等常量,在同一目录中。
uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
uint8_t 价值 = 0;
uint8_t i;
for (i = 0; i < 8; ++i) {
digitalWrite(clockPin, HIGH);
if (bitOrder == LSBFIRST)
价值 |= digitalRead(dataPin) << i;
else
价值 |= digitalRead(dataPin) << (7 - i);
digitalWrite(clockPin, LOW);
}
return 价值;
}
有三个参数:
该函数从设备返回8位数据作为字节(UINT8_T)。
基本操作是使用for-循环循环通过每个位。
在循环中,第一个动作是将时钟信号输出到高。
然后来自DigitalRead()的输入值由当前左移
循环值(i)并ored进入变量'value'。在此之后,时钟
signal is set low.
以这种方式,每次设置时都会读取数据线
高的。每个输入位都放入'value'变量,其位
移位位置,直到检索8位。然后函数返回
the variable 'value'.
代码通过使用位移运算符来工作'<<'它将变量中的所有位移到左侧。
假设Bitorder是LSBFirst,然后是第一个循环迭代i
是零,术语(1 <<i)将左侧的变量转移到零个位置
即它与值1离开变量。
00000001B
下次循环周围变量保存值1左移一个地方:
00000010B
这重复了6次
00000100B
00001000B
00010000B
00100000B
01000000B
10000000B
以这种方式走路'1'创建从b0到b7移动。
对于MSBFirst的比特权,索引的值被操纵到
为每一个值从b7移动到b0。所以走路'1' walks in the
从位7开始的方向。
自变量以来'value'在开始时被初始化为零
例程,每个传入数据位都在变量中取入到位。
这是不同的 ShiftOut() , 在哪里和使用。这是因为oring将比特添加到同一个方面 变量(离开其他未改变),而且每个都是隔离的 距离剩下的钻头(用于输出)。
该函数使用DigitalRead()所以它应该类似于
speed of 数号() - 在该链接脉冲周期(用于Arduino
Uno) is 7us.
由于需要8个脉冲,Shiftin()应该需要大约56us加上比特操纵和循环循环 for-loop. 。事实上,Shiftin()的额外操作这次(见下文)。
以下草图在引脚7上输出标记信号(您可以
触发串行数据开始的范围)并备用数据
使用模式0x55和0x99 - 交替数据模式。
// Demonstration code for shiftIn
在 t MARK = 7;
在 t SERCLK = 6;
在 t SERDATA = 5;
void setup() {
pinMode(MARK, OUTPUT);
pinMode(SERDATA, INPUT);
pinMode(SERCLK, OUTPUT);
noInterrupts();
}
void loop() {
byte d;
digitalWrite(MARK, HIGH);
d = shiftIn(SERDATA, SERCLK, MSBFIRST);
digitalWrite(MARK, LOW);
digitalWrite(SERDATA, LOW); // Stop scope output flicker.
delay(10);
}
示波器输出标记信号
120us(最长的信号)。时钟信号的时期是:14.37US(〜69.6kHz)。
但是,您通常会使用标记信号作为芯片选择,
所以它是可实现的时机的代表(CS通常是
倒置使其处于活跃低)。
黄线显示销6上的时钟信号
接下来是销7上的标记信号(蓝色)。
时基是10US,幅度为2V / div。
使用ADS1115精度16位ADC进行教程进行低功耗。
arduino. 模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。
了解DigitalWrite()的工作原理......现在使用17倍宏宏!
如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。
使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。
HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。
新的! Comments
让你说到你刚刚阅读的东西!留下下面的框中的评论。