GPIO模拟SPI

4wire,8bit
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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值