miyago icon

SPI raw

miyago | PRO | 04/03/20 03:20:44 PM UTC | 0 ⭐ | 403 👁️ | Never ⏰ | []
C |

2.61 KB

|

None

|

0 👍

/

0 👎

#include <avr/io.h>
#include <Arduino.h>
 
#define F_CPU 1600000UL
 
/* SPCR SPI controler register
Bit 7 SPIE - interrupt enable
Bit 6 SPE - SPI enable
Bit 5 DORD - Data order msb=0 or lsb=1 first
Bit 4 MSTR - Master=1/slave=0 select
Bit 3 CPOL - clock polarity
Bit 2 CPHA - clock phase
Bit 1 SPR1 - Clock rate select 1
Bit 0 SPR0 - Clock rate select 0
 000    /4
 001    /16
 010    /64
 011    /128
 100    /2
 101    /8
 110    /32
 111    /64
*/
 
/*  SPSR - SPI Status register
Bit 7 SPIF - interrupt flag
Bit 6 WCOl - Write COLlision flag
Bit 5-1 används inte alltid 0
Bit 0 SPI2X - Double SPI speed bit
 
EEPROM uploading och downloading sida 308 i databladet
*/
 
/* SPDR - SPI Data Register = read write register.
Om man skriver till detta register så påbörjas överföringen.
Om man läser från detta register läses Shift Register Receive buffer.
*/
 
/* Port B pinnar
PB5 SCK
PB4 MISO
PB3 MOSI
Pb2 SS
PB0 PCINT0
*/
 
char cData;
 
void SPI_MasterInit(void)
{
 
    /* Set MOSI and SCK output, all others input */
    DDRB = (1 << DDB3) | (1 << DDB5) | (1 << DDB2);
    /* Enable SPI, Master, set clock rate fck/16 */
    SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0);
}
 
void SPI_MasterTransmit(char cData)
{
    /* Start transmission */
    //cData = 0xF8;
    SPDR = cData;
    /* Wait for transmission complete */
    while (!(SPSR & (1 << SPIF)))
        ;
}
 
void delayLoop(uint32_t iterations)
{
    while ((--iterations) > 0)
    {
        asm volatile("nop");
    }
}
 
int main(void)
{
    PRR = (0 << PRSPI);
    DDRB = (1 << DDB0) | (1 << DDB3) | (1 << DDB5);
    PORTB = (0 << PB0);
 
    while (1)
    {
        SPI_MasterInit();
 
        SPI_MasterTransmit(0xC3);
 
        delayLoop(100);
 
        SPI_MasterTransmit(0xAA);
 
        delayLoop(100);
 
        SPI_MasterTransmit(0xF8);
        delayLoop(10000);
    }
}
 
// #include <Arduino.h>
// #include <SPI.h>
 
// #define SPI_SS_PIN    10
// #define SPI_MOSI_PIN  11
// #define SPI_MISO_PIN  12
// #define SPI_SCK_PIN   13
// #define SPI_CLOCK_SPEED 1000000
 
// void setup() {
//   pinMode(SPI_SS_PIN, OUTPUT);
//       digitalWrite(SPI_SS_PIN, HIGH);
 
//   SPI.begin();
//    SPI.setClockDivider(SPI_CLOCK_DIV128);//divide the clock by 8
 
// }
 
// void loop() {
 
//     SPI.beginTransaction(SPISettings(SPI_CLOCK_SPEED, MSBFIRST, 0x00));
//     digitalWrite(SPI_SS_PIN, LOW);
//     SPI.transfer(0xAA);
//     SPI.transfer(0x0F);
//     SPI.transfer(0xC3);
 
//     SPI.endTransaction();
//         digitalWrite(SPI_SS_PIN, HIGH);
 
//     delay(100);
 
// }

Comments