覆盆子PI到AVR attiny26通过SPI - 三线模式,乱码输出

时间:2017-04-23 08:58:13

标签: avr spi garbage attiny

我将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漂浮时立即开始计时。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

遗憾的是,我不得不说这一个进入了RTFM类别。

经过一番研究后,我发现Pi GPIO的工作电压为+ 3.3V。 Attiny设定使用+ 5V。将AVR重新连接到3.3V工作后,一切似乎都在起作用。

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