SPI总线协议和裸板操作

好久没发表了哈,前一段时间准备找工作的事情啦,但是基本上告一段落了,把一些自己以前学习的心得写在这里,以后想看的时候再回来看,当然也欢迎想学习的来交流啊。

SPI总线,全名是Serial Peripheral Interface,串行外部总线,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议。

一般是mcu上引出四个管脚来连接spi设备,分别是MISO(master input/slave output),MOSI(master output/slave input),CSn(chip sleect),SPICLK管脚,spi总线两端的设备既可以当host也可以当slave,MISO和MOSI都是随着master和slave角色的变化都在变化成输入或者是输出引脚,CSn电平是低电平时候表示片选,SPICLK是时钟信号。

一般来说,spi传输的时候有CPOL和CPHA两个属性,CPOL=0表示总线上边没有数据的时候是低电平,=1表示为高电平,cpha=0表示是在第一个时钟变化的地方读取数据,=1表示在第二个时钟变化的地方读取数据,根据四种格式,上大图啦~~


第一种格式CPOL和CPHA都是0,先读取最高位,没有数据传输的时候都是低电平,在第一个电平变化的地方读取或者是发送数据。

第二种格式就是这样cpol=0表示没有数据传输的时候是低电平,cpha=1表示在第二个时钟变化的时候读取数据。

种格式就是这样cpol=1表示没有数据传输的时候是高电平,cpha=0表示在第一个时钟变化的时候读取数据。

种格式就是这样cpol=1表示没有数据传输的时候是高电平,cpha=1表示在第二个时钟变化的时候读取数据。

说的再多不如来点实惠的,以裸板程序为例,(c语言,已经初始化过时钟)

首先是spi总线的初始化函数,一般的裸板程序的初始化就是设置gpio管脚为输入还是输出,然后片选信号拉低,就ok啦

我用的是s3c2440的板子~~

void gpio_spi_init(void)
{
//set the gpio pins 
//gpg5 in gpg6 out gpf1 out gpg7 out gpg2 out gpg4 out
GPGCON &= ~(GPGCON2_MASK|GPGCON4_MASK|GPGCON5_MASK|GPGCON6_MASK|GPGCON7_MASK);
GPGCON |= (1<<12 | 1<<14 | 1<<4 | 1<<8);
GPFCON &= ~(GPFCON1_MASK);
GPFCON |= (1<<2);
//set oled select flash not select
GPFDAT &= ~(1<<1);
GPGDAT |= (1<<2);
}

不同的板子和芯片不同,操作有点不一样,但是思想不会变的。写入数据的函数也不难,对应时钟顺序,自己实现,按照格式1来传输的话,就是一开始输出低电平,然后向总线上写入数据,再拉高时钟就ok啦。比如这样

void spi_send_byte(char val)
{
int i;
//format A
for(i=0;i<8;i++)
{
spi_set_clk(0);
if(val&0x80)
spi_set_do(1);
else
spi_set_do(0);
spi_set_clk(1);
val <<= 1;
}
}

读取数据也类似,先设置为低电平,然后再读取,读取完毕以后拉高。

char spi_recv_byte(void)
{
int i;
char ch;
for(i=0;i<8;i++)
{
ch <<= 1;
spi_set_clk(0);
if(spi_get_di())
ch |= 1;
spi_set_clk(1);
}
return ch;
}

差不多就这样了,spi还是比较简单的,比起USB已经很简单了,什么时候抽空把USB的文章发出来,造福大众啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值