我将Raspberry PI 3通过SPI连接到AVR Attiny26,后者又连接了一个LCD。我正在尝试让SPI运行,
现在,问题在于当我将AVR设置为双线模式并且不在PB1上配置上拉时(MISO注释掉):
USICR = (1<<USIOIE)|(1<<USIWM1)|(1<<USICS1); // Enable USI interrupt - USIOIE=1
// Three wire mode USIWM1=0, USIWM0=1
// Two wire mode USIWM1=1, USIWM0=0
// External clock USICS1=1
//PORTB |= (1<<SPI_MISO); // Enable pull-ups on SPI port
DDRB = 0b01001010; /* Set PORTB bits: 7-4 as input
-- PB7 - Pushbutton (KEY1)/RESET
-- PB6 - Pushbutton (KEY2)/INT0
-- PB5 - ADC8 (T2)
-- PB4 - ADC7 (T1)
-- PB3 - PUMP
-- PB2 - SCK - 0 = external clock (input)
-- PB1 - MISO (output)
-- PB0 - MOSI (input) - */
ISR(USI_OVF_vect) {
disp[counter++] = USIDR;
if(counter==16)
counter = 0;
USISR |= (1<<USIOIF);
}
我将字符串转移并打印在液晶显示屏上。
然而,当我将AVR更改为在三线模式下工作和/或启用PB1上拉时,我得到的只是垃圾。收到的字符和发送的字符都不匹配,也不算数。
Raspberry是这里的主人,提供所有时钟,设置总是相同(默认,三线模式),时钟相当慢。
int main(int argc, char **argv) {
int res = bcm2835_init();
printf("BCM2835 Init() = %d\n", res);
res = bcm2835_spi_begin();
printf("BCM2835 Begin() = %d\n", res);
bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536);
char data[16];
sprintf(data,"%s","<--Some data-->");
int len = strlen(data);
printf("Sent: %s\n", data);
bcm2835_spi_writenb(data, len);
exit(0);
}
与使用ioctl的spidev_test程序相同的结果,所以似乎与库/ Pi的程序无关。
最重要的是,让我感到困惑的是,当我从PB1(MISO)断开电线时,我立即开始从Pi接收垃圾。好像Pi的SPI在PB1 / MISO漂浮时立即开始计时。
我在这里缺少什么?
答案 0 :(得分:0)
遗憾的是,我不得不说这一个进入了RTFM类别。
经过一番研究后,我发现Pi GPIO的工作电压为+ 3.3V。 Attiny设定使用+ 5V。将AVR重新连接到3.3V工作后,一切似乎都在起作用。
它在双线模式下工作的原因是没有AVR的上拉电阻(需要外部电阻),这使得Pi可以自己使用并在Pi和AVR可接受的范围内驱动AVR引脚。在AVR上启用上拉将使Pi的GPIO超过限制。显然没有造成任何损害,只有不可预测且难以解释的行为。