📄 spi.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 + -