1

我通过 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 立即开始计时。

我在这里想念什么?

4

1 回答 1

0

遗憾的是,我不得不说这个属于 RTFM 类别。

经过一番研究,我发现 Pi GPIO 适用于 +3.3V。Attiny 设置为使用+ 5V。在将 AVR 重新连接到 3.3V 后,一切似乎都正常了。

它在双线模式下工作的原因是没有 AVR 的上拉电阻(需要外部),这允许 Pi 使用自己的并在 Pi 和 AVR 都可接受的范围内驱动 AVR 引脚。在 AVR 上启用上拉将使 Pi 的 GPIO 超出限制。显然没有造成任何损害,只有不可预测且难以解释的行为。

于 2017-04-27T18:51:28.093 回答