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

📄 spi.c

📁 可采集MBF指纹传感器图像
💻 C
字号:
/***********************************************
**spi.c**
**base functions: init, close, read, write.**
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "spi.h"

/*** S3C2410 SPI register offset****/
#define rSPCON0    0x00 //SPI0 control
#define rSPSTA0    0x04 //SPI0 status
#define rSPPIN0    0x08 //SPI0 pin control
#define rSPPRE0    0x0c //SPI0 baud rate prescaler
#define rSPTDAT0   0x10 //SPI0 Tx data
#define rSPRDAT0   0x14 //SPI0 Rx data

#define CS_offs    0xff

#define TIMEOUT    1000

#define  FCLK 203000000  //152000000//203000000
#define  HCLK (FCLK/2)
#define  PCLK (HCLK/2)    
#define BAUD_RATE 5000000
#define PRESCALER_VALUE  (PCLK/2/BAUD_RATE - 1)

int Dvtop=-1;

void register_write(off_t offset, unsigned char *data)
{
	lseek(Dvtop,offset,SEEK_SET);
	write(Dvtop,data,1); 
}

void register_read(off_t offset, unsigned char *data)
{
	lseek(Dvtop,offset,SEEK_SET);
	read(Dvtop,data,1);
}

int SPI_Init()
{
	unsigned char wdata;
	unsigned char rdata;
	
//	printf("SPI_Init\n");
	
	if((Dvtop = open("/dev/vtop",2)) == -1)
	{
		printf("open /dev/vtop failed!\n");
		return -1;
	}
	
	/* set baud prescaler value */
	wdata = PRESCALER_VALUE;
	register_write(rSPPRE0, &wdata);
	
	/* set SPCONn to configure properly the SPI module */
	wdata = 0x18;
	register_write(rSPCON0, &wdata); /*polling mode, SCK enable, master, active high, format A, normal mode */
	
	/*Set a GPIO pin, which acts as nSS*/
	wdata = 0x02;
	register_write(rSPPIN0, &wdata); /*multi master error detect disable, release */
	
	
	
	/*
	register_read(rSPPRE0, &rdata);
	printf("rSPPRE0 = 0x%x\n",rdata);
	
	register_read(rSPCON0, &rdata);
	printf("rSPCON0 = 0x%x\n",rdata);
	
	register_read(rSPPIN0, &rdata);
	printf("rSPPIN0 = 0x%x\n",rdata);
	*/
	return 0;
}

void SPI_CSLow() //cs enable
{
	unsigned char data = 0x0;
	lseek(Dvtop,0xff,SEEK_SET);
	write(Dvtop,&data,1);
}

void SPI_CSHigh() //cs disable
{
	unsigned char data = 0x1;
	lseek(Dvtop,0xff,SEEK_SET);
	write(Dvtop,&data,1);
}

int SPI_Write(unsigned char data)
{
	unsigned char status;
	int i = 0;
	
	while(i < TIMEOUT)
	{
		register_read(rSPSTA0, &status);
		if(status & 0x01)
		      break;
		i++;
	}
	
		
	if(i >= TIMEOUT)
	{
		printf("SPI_Write error: timeout\n");
		return -1;
	}
	register_write(rSPTDAT0, &data);
	return 0;
	
	
}

int SPI_Read(unsigned char *data)
{
	unsigned char status;
	unsigned char wdata;
	int i = 0;
	
	wdata = 0xff;
	register_write(rSPTDAT0, &wdata);
	while(i < TIMEOUT)
	{
		register_read(rSPSTA0, &status);
		if(status & 0x01)
		      break;
		i++;
	}
	if(i >= TIMEOUT)
	{
		printf("SPI_Read error: timeout\n");
		return -1;
	}
	register_read(rSPRDAT0, data);
	return 0;
}


void SPI_Close()
{
	unsigned char wdata;
	
//	printf("SPI_Close\n");
	/* set SPCONn to configure properly the SPI module */
	wdata = 0x00;
	register_write(rSPCON0, &wdata);
	
	close(Dvtop);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -