📄 spi.c
字号:
/** \file
<b>SPI</b><br>
Autor: Matthias Wei遝r<br>
Copyright 2004: Matthias Wei遝r<br>
License: QPL (see license.txt)
<hr>
*/
#include <avr/io.h>
#include <avr/eeprom.h>
#include "spi.h"
#include "tools.h"
#include "extern_vars.h"
void spi_enable(void)
{
unsigned char i;
R_RES_ON;
wait_ms(2);
PORTB&=BIT3_NEG&BIT5_NEG; //MOSI und SCK low
DDRB|=BIT3_POS|BIT5_POS; //MOSI und SCK als Ausgang
SPCR=0x51; //SPI Master /16
R_RES_OFF;
for(i=0;i<200;i++) asm("nop");
R_RES_ON;
wait_ms(2);
spi_set_speed(eeprom_read_byte(&eeprom_sck_period));
}
void spi_disable(void)
{
SPCR=0x00; //SPI aus
DDRB&=BIT3_NEG&BIT5_NEG; //MOSI und SCK als Eingang (hochohmig)
R_RES_OFF;
}
void spi_reset(void)
{
R_RES_OFF;
wait_ms(2);
R_RES_ON;
}
/**
Stellt die Geschwindigkeit des SPI-Busses ein (bei f=8MHz)
0: /2 4MHz --SPI2X
1 /4 2MHz
2: /8 1MHz --SPI2X
3 /16 500kHz
4: /32 250kHz --SPI2X
5 /64 125kHz
6: /128 62,5kHz
weitere Geschwindigkeiten geplant
-> dann per Software-SPI
*/
void spi_set_speed(unsigned char s)
{
if((s==0)||(s==2)||(s==4)) SPSR|=1; else SPSR&=0xFE;
switch(s)
{
case 0:
case 1:
SPCR&=0xFC;
break;
case 2:
case 3:
SPCR&=0xFC;
SPCR|=0x01;
break;
case 4:
case 5:
SPCR&=0xFC;
SPCR|=0x02;
break;
case 6:
SPCR|=0x03;
break;
default: //Wenn Wert ung黮tig ganz langsam
SPCR|=0x03;
break;
}
}
void spi_clock_pulse(void)
{
SPCR&=BIT6_NEG; //SPI kurz aus
PORTB|=BIT5_POS; //Taktimpuls
wait_ms(2);
PORTB&=BIT5_NEG;
SPCR|=BIT6_POS; //SPI wieder an
}
unsigned char spi_transfer_8(unsigned char d)
{
SPDR=d;
while(!(SPSR&0x80));
return SPDR;
}
unsigned char spi_transfer_16(unsigned int d)
{
spi_transfer_8((d>>8)&0xFF);
return spi_transfer_8(d&0xFF);
}
unsigned char spi_transfer_32(unsigned long d)
{
spi_transfer_8((d>>24)&0xFF);
spi_transfer_8((d>>16)&0xFF);
spi_transfer_8((d>>8)&0xFF);
return spi_transfer_8(d&0xFF);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -