我通过 SPI 将 Raspberry PI 3 连接到 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);
}
我将字符串转移并打印在 LCD 上。
但是,当我将 AVR 更改为在三线模式下工作和/或启用 PB1 上拉时,我得到的只是垃圾。接收到的字符与发送的字符都不匹配,也不计数。
树莓是这里的主人,提供所有时钟,那里的设置总是相同的(默认,三线模式),时钟相当慢。
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 的垃圾。好像当 PB1/MISO 浮出水面时,Pi 的 SPI 立即开始计时。
我在这里想念什么?