Attiny 84 Общение с RTC через проблемы SPI

В настоящее время я пытаюсь использовать ATtiny84 для связи с RTC (DS1305) через SPI, чтобы зуммер вибрировал каждый переменный промежуток времени. Я пытался установить alarm0 на DS1305. Однако у 84 нет "технически" SPI. Он имеет USI, который может быть запрограммирован как SPI. Мне было интересно, если кто-нибудь из вас может проверить мои соединения кода / платы и сообщить мне, если вы видите какие-либо проблемы. В настоящее время проблема заключается в том, что я не могу получить какое-либо сообщение через SPI, и у меня возникают проблемы с поиском причины проблемы.

Текущие соединения платы:

ATtiny84 | DS1305

MOSI ------ DI

MISO ------ DO

USCLK ---- CLK

Листки:

Attiny84

DS1305

Board View

Схематический вид

    /*
 * Atmel_Jolt_Code.c
 *
 * Created: 11/28/2018 10:44:30 PM
 * Author : Nick Hulsey
 */ 

#include <avr/io.h>
#define F_CPU 16000000UL
#include <avr/interrupt.h>
#include <util/delay.h> 

//variables for SPI
#define SPI_DDR_PORT DDRA
#define CE_PIN DDA3 //I ADDED *****
#define DO_DD_PIN DDA5  // SHOULD WE 
#define DI_DD_PIN DDA6  // THEM FLIP
#define USCK_DD_PIN DDA4
#define SPI_MODE0 0x00
#define SPI_MODE1 0x04

#define MOTOR_PIN DDA7 //I ADDED *****

void SPI_begin();
void setDataMode(uint8_t spiDataMode);
uint8_t transfer(uint8_t spiData);
void flipLatch(uint8_t on);

int main(void)
{
    SPI_begin();
    setDataMode(SPI_MODE1);
    DDRA |= (1 << MOTOR_PIN);


    //**startup**
    uint8_t status_register = 0x10;
    uint8_t control_register = 0x8F;
    uint8_t control_byte = 0x05;

    uint8_t alarm_registers[] = {0x8A, 0x89, 0x88, 0x87};

    //set control
    flipLatch(1);
    transfer(control_register);
    transfer(0);
    flipLatch(0);

    flipLatch(1);
    transfer(control_register);
    transfer(control_byte);
    flipLatch(0);


    //set alarm:
    for (int i = 0; i < 4; i++){
        flipLatch(1);
        transfer(alarm_registers[i]);
        transfer(0x80); //0b10000000
        flipLatch(0);
    }

    //THIS MIGHT NEED WORK
    //GIMSK |= (1 << PCIE1);//set external interrupt (A1)
    PCMSK0 |= (1 << PCINT1);
    sei();


    while (1) //our main loop
    {
        //reading the flag from the status register
        uint8_t status = transfer(status_register);

        if(status == 0x01){//if alarm 0 has been flagged
            PORTA ^= (1 << MOTOR_PIN);
            _delay_ms(100);
        } 

    }   
}

//if A1 has changed state at all this function will fire
ISR(PCINT1_vect){
    PORTA ^= (1 << MOTOR_PIN);//invert motor power
    _delay_ms(100);
}
void SPI_begin(){
    USICR &= ~((1 << USISIE) | (1 << USIOIE) | (1 << USIWM0));//Turn off these bits
    USICR |= (1 << USIWM0) | (1 << USICS1) |  (1 << USICLK);//Turn on these bits
                            //REVIEW THIS PAGE 128
                            //external,positive edge software clock 
                            //What does this mean
    SPI_DDR_PORT |= 1 << USCK_DD_PIN;   // set the USCK pin as output
    SPI_DDR_PORT |= 1 << DO_DD_PIN;     // set the DO pin as output
    SPI_DDR_PORT |= 1 << CE_PIN;// ******** I ADDED
    SPI_DDR_PORT &= ~(1 << DI_DD_PIN);    // set the DI pin as input

}


void setDataMode(uint8_t spiDataMode)
{
    if (spiDataMode == SPI_MODE1)
        USICR |= (1 << USICS0);
    else
        USICR &= (1 << USICS0);
}

//returns values returned from the IC
uint8_t transfer(uint8_t spiData)
{
    USIDR = spiData;
    USISR = (1 << USIOIF);                // clear counter and counter overflow interrupt flag
    //ATOMIC_BLOCK(ATOMIC_RESTORESTATE)   // ensure a consistent clock period
    //{
        while ( !(USISR & (1 << USIOIF)) ) USICR |= (1 << USITC);
    //} 
    return USIDR;
}


void flipLatch(uint8_t on){ 
    if (on == 1)
        PORTA |= (1 << CE_PIN);
    else
        PORTA &= ~(1 << CE_PIN);


}

0 ответов

Другие вопросы по тегам