#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