Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带Atmega32和At42QT2100的SPI_C_Avr_Spi_Atmel - Fatal编程技术网

C 带Atmega32和At42QT2100的SPI

C 带Atmega32和At42QT2100的SPI,c,avr,spi,atmel,C,Avr,Spi,Atmel,我无法从Atmega3216PU与at42qt2100通信 数据表包括:和 这是我的代码: #include <avr/io.h> #include <util/delay.h> #include <stdio.h> #define F_CPU 16000000 #define UART_BAUD_RATE 9600 #define UART_BAUD_REGISTERS (((F_CPU / (UART_BAUD_RATE * 16UL))) - 1)

我无法从Atmega3216PU与at42qt2100通信

数据表包括:和

这是我的代码:

#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#define F_CPU  16000000
#define UART_BAUD_RATE  9600
#define UART_BAUD_REGISTERS  (((F_CPU / (UART_BAUD_RATE * 16UL))) - 1)

int printCHAR(char character, FILE *stream)
{
    while ((UCSRA & (1 << UDRE)) == 0) {};
    UDR = character;
    return 0;
}
FILE uart_str = FDEV_SETUP_STREAM(printCHAR, NULL, _FDEV_SETUP_RW);

void setup(){
    // Init SIO
    UCSRB |= (1 << RXEN) | (1 << TXEN);
    UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);

    UBRRL = UART_BAUD_REGISTERS;

    fprintf(&uart_str, "");
    stdout = &uart_str;
    printf("");

    //Init spi
    //set MOSI, SCK and SS output, all others input
    DDRB |= (1<<DDB7)|(1<<DDB5)|(1<<DDB4);
    SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0)|(1<<CPHA)|(1<<CPOL);

}

void loop(){

    uint8_t data = 0b01000000; //Sending this sequence should return device id
    printf("Sending: %d \n",data);
    _delay_ms(10000);
    PORTB &= 0b11101111; // SS auf LOW!! (Pin4)
    SPDR = data;
    while(!(SPSR & (1<<SPIF)));
    PORTB |= (1<<PB4); // SS auf HIGH!! (Pin4)
    printf("Receiving: %d \n",SPDR);
    _delay_ms(10000);
}

void main(){
    setup();
    while(1){
        loop();
    }
}
#包括
#包括
#包括
#定义F_CPU 16000000
#定义UART_波特率9600
#定义UART_波特率寄存器(((F_CPU/(UART_波特率*16UL))-1)
int printCHAR(字符,文件*流)
{

虽然((UCSRA&(1我对您参考的AT42QT2100数据表进行了快速概述,我立即发现了几个问题:

  • SS设置为低后,主机必须等待>2us(在自由运行模式下)才能启动SCK。您将立即启动SPI传输,如果您正在运行16MHz,这意味着您可能会在SS设置为低后的62.5ns内启动传输
  • 数据表还指出,主机必须在10毫秒内发送3个数据字节,否则事务将被视为错误,通信交换将被重置。您发送1个字节,然后等待20秒再发送下一个字节
  • 数据表显示,在发送3个字节后,设备设置将变为活动状态。这意味着必须再发送3个字节才能获得对命令的响应
  • 您应该按照以下思路做更多的工作:

    #define NUM_DATA_BYTES   3
    void loop(){
        uint8_t sendData[NUM_DATA_BYTES] =
        {
            0b01000000, /* Device Version Command and default values. */
            0b00000000, /* Default Value for Byte 2. */
            0b11000000, /* Default Value for Byte 3. */
        };
        uint8_t receiveData[NUM_DATA_BYTES] = { 0 };
        uint8_t i;
    
        PORTB &= 0b11101111; // SS auf LOW!! (Pin4)
    
         /* Ensure that >2us delay requirement is met.  Although, the 
            for() loop below will probably introduce enough delay. */
        _delay_ms(1);
    
        /* Send command data. */
        for (i = 0; i < NUM_DATA_BYTES; i++)
        {
                SPDR = sendData[i];
                while(!(SPSR & (1<<SPIF)));
        }
        PORTB |= (1<<PB4); // SS auf HIGH!! (Pin4)
    
        /* Delay here may be unnecessary, but it ensures that timing
           issues do not occur. */
        _delay_ms(1);
        PORTB &= 0b11101111; // SS auf LOW!! (Pin4)
        _delay_ms(1);
    
        /* Receive device response data. */
        for (i = 0; i < NUM_DATA_BYTES; i++)
        {
                SPDR = sendData[i];
                while(!(SPSR & (1<<SPIF)));
                receiveData[i] = SPDR;
    
                printf("Receiving byte %d: %d \n", (i + 1), receiveData[i]);
        }
        PORTB |= (1<<PB4); // SS auf HIGH!! (Pin4)
    
        _delay_ms(10000);
    }
    
    #定义NUM_数据_字节3
    void循环(){
    uint8\u t发送数据[数据字节数]=
    {
    0b01000000、/*设备版本命令和默认值*/
    0b00000000,/*字节2的默认值*/
    0b11000000,/*字节3的默认值*/
    };
    uint8_t receiveData[NUM_DATA_BYTES]={0};
    uint8_t i;
    端口B&=0b11101111;//SS auf低!!(Pin4)
    /*确保满足大于2us的延迟要求。尽管
    下面的for()循环可能会引入足够的延迟*/
    _延迟时间(1);
    /*发送命令数据*/
    对于(i=0;i而(!(SPSR&(1)不要使用魔法值。
    #使用表达性名称(大写)定义它们。
    调试器会怎么说?你确定
    SPIF
    和其他比特是作为比特位置给出的,而不是掩码吗?你是如何将你的从属设备与主设备连接的?我的意思是,它是一个用电线焊接的设备,还是在标准PCB布局上?