⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.c

📁 AVR单片机,STK500下载线制作全套资料,包括程序,电路图
💻 C
字号:
/**	\file 
	<b>SPI</b><br>
	Autor: Matthias Wei遝r<br>
	Copyright 2005: Matthias Wei遝r<br>
	License: QPL (see license.txt)
	<hr>
*/
#include "stk500.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));
	spi_set_speed(SPI_SPEED_230KHz);
}

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=3.6864MHz)
	0:		/4			921.50KHz
	1:		/16			230.37kHz
	2:		/64			 57.59kHz
	3:		/128		 28.79kHz
	26:		/			4kHz
	0xFE:	/			603Hz
	
	weitere Geschwindigkeiten geplant
	-> dann per Software-SPI	
*/
void spi_set_speed(unsigned char s) {
	
	switch(s) {
		case 0:
			SPCR&=0xFC;
			break;
		case 1:
			SPCR&=0xFC;
			SPCR|=0x01;
			break;
		case 2:
			SPCR&=0xFC;
			SPCR|=0x02;
			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
}

/**
	Does a 8 bit transfer over the SPI-Interface
	and gives back the byte received
	
	@param	d	the byte to be transmitted
	
	@return		the byte received
*/
unsigned char spi_transfer_8(unsigned char d)
{
	SPDR=d;
	while(!(SPSR&0x80));
		
	return SPDR;	
}

/**
	Does a 16 bit transfer over the SPI-Interface
	and gives back the last byte received
	
	@param	d	the int to be transmitted
	
	@return		the last byte received
*/
unsigned char spi_transfer_16(unsigned int d)
{	
	spi_transfer_8((d>>8)&0xFF);
	return spi_transfer_8(d&0xFF);	
}

/**
	Does a 32 bit transfer over the SPI-Interface
	and gives back the last byte received
	
	@param	d	the long to be transmitted
	
	@return		the last byte received
*/
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 + -