1,设定要用的GPIO口。
#define S3C_FB_SPI_MISO(x) (S3C64XX_GPC(0)) //输入
#define S3C_FB_SPI_CLK(x) (S3C64XX_GPC(1)) //CLK
#define S3C_FB_SPI_MOSI(x) (S3C64XX_GPC(2)) //输出
#define S3C_FB_SPI_CS(x) (S3C64XX_GPG(0)) //片选
#define S3C_FB_SPI_RS(x) (S3C64XX_GPG(2)) //复位(区别写数据或者写指令,一般的SPI通讯上述4根足够)
2,按要求设定各SPI口的高低电平函数
void s3cfb_spi_lcd_dclk(int ch, int value) //设置CLK高低
{
gpio_set_value(S3C_FB_SPI_CLK(ch), value);
}
void s3cfb_spi_lcd_dseri(int ch, int value) //设置输出高低
{
gpio_set_value(S3C_FB_SPI_MOSI(ch), value);
}
void s3cfb_spi_lcd_den(int ch, int value) //设置片选高低
{
gpio_set_value(S3C_FB_SPI_CS(ch), value);
}
void s3cfb_spi_lcd_drs(int ch, int value) //设置复位高低
{
gpio_set_value(S3C_FB_SPI_RS(ch), value);
}
int s3cfb_spi_lcd_read_dseri(int ch) //读输入数据
{
return gpio_get_value(S3C_FB_SPI_MOSI(ch));
}
3,SPI读写函数
#define S3C_FB_SPI_CH 0 //SPI通道号,依实际而定
int s3cfb_spi_read_data(void)
{
unsigned int delay = 50; //CLK延时,依具体而定
int i,read_data,read_bit;
s3cfb_spi_lcd_den(S3C_FB_SPI_CH, 1); //片选拉高
s3cfb_spi_lcd_dclk(S3C_FB_SPI_CH, 1); //CLK拉高
s3cfb_spi_lcd_dseri(S3C_FB_SPI_CH, 1); //输出拉高
udelay(delay);
s3cfb_spi_lcd_den(S3C_FB_SPI_CH, 0); //片选拉低,选中
udelay(delay);
s3cfb_spi_lcd_drs(S3C_FB_SPI_CH, 1); //复位拉高
read_data = 0; //默认数据0
for (i = 7; i >= 0; i--) //从高位开始读
{
s3cfb_spi_lcd_dclk(S3C_FB_SPI_CH, 0); //CLK拉低
udelay(delay);
read_bit = s3cfb_spi_lcd_read_dseri(S3C_FB_SPI_CH); //读输入数据
if(0!=read_bit)
{
read_data |= (1<<i); //依次存高位
}
s3cfb_spi_lcd_dclk(S3C_FB_SPI_CH, 1); //CLK拉高
udelay(delay);
}
s3cfb_spi_lcd_den(S3C_FB_SPI_CH, 1); //片选拉高,清掉
udelay(delay);
return(read_data); //返回读的数据BYTE
}
void s3cfb_spi_write_byte(unsigned int data, unsigned int cs)
{
unsigned int delay = 50;
int i;
s3cfb_spi_lcd_den(S3C_FB_SPI_CH, 1); //片选拉高
s3cfb_spi_lcd_dclk(S3C_FB_SPI_CH, 1); //CLK拉高
s3cfb_spi_lcd_dseri(S3C_FB_SPI_CH, 1); //输出拉高
udelay(delay);
s3cfb_spi_lcd_den(S3C_FB_SPI_CH, 0); //片选拉低,选中
udelay(delay);
if (0==cs)
s3cfb_spi_lcd_drs(S3C_FB_SPI_CH, 0); //写0,复位拉低。表示写入的是指令(该处可能依实际要求而定)
else
s3cfb_spi_lcd_drs(S3C_FB_SPI_CH, 1); //写1,复位拉高。表示写入的是数据
udelay(delay);
for (i = 7; i >= 0; i--)
{
s3cfb_spi_lcd_dclk(S3C_FB_SPI_CH, 0); //CLK拉低
if ((data >> i) & 0x1) //先写高位
s3cfb_spi_lcd_dseri(S3C_FB_SPI_CH, 1); //是1就输出拉高
else
s3cfb_spi_lcd_dseri(S3C_FB_SPI_CH, 0); //是0就输出拉低
udelay(delay);
s3cfb_spi_lcd_dclk(S3C_FB_SPI_CH, 1); //CLK拉高
udelay(delay);
}
s3cfb_spi_lcd_drs(S3C_FB_SPI_CH, 1); //复位拉高
udelay(delay);
s3cfb_spi_lcd_den(S3C_FB_SPI_CH, 1); //片选拉高,清掉
udelay(delay);
}