SPI驅(qū)動(dòng)!S3C6410 SPI 裸機(jī)驅(qū)動(dòng)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
剛剛寫(xiě)的SPI驅(qū)動(dòng),想移植到LINUX上面用來(lái)讀寫(xiě)SD卡
只測(cè)試了發(fā)送,沒(méi)有測(cè)試接收.
spi.c
/*************************************************************************************************************
*文件名:spi.c
*功能:S3C6410SPI底層驅(qū)動(dòng)函數(shù)
*作者:陳鵬
*創(chuàng)建時(shí)間:2012年9月8日20:35
*最后修改時(shí)間:2012年9月8日
*詳細(xì):SPI始化,發(fā)送,接收,配置等
*使用的是手動(dòng)控制片選,因?yàn)樵趯?shí)際使用過(guò)程中手動(dòng)控制片選較為靈活,但是也有個(gè)問(wèn)題,就是何時(shí)取消片選,應(yīng)為數(shù)據(jù)寫(xiě)入到發(fā)送FIFO并
*不代表數(shù)據(jù)已經(jīng)發(fā)送完成了,如果在數(shù)據(jù)沒(méi)有發(fā)送完成之前取消了片選會(huì)導(dǎo)致數(shù)據(jù)傳輸錯(cuò)誤,因此簡(jiǎn)單的方法就是在發(fā)送數(shù)據(jù)后加入一定
*的延時(shí),讓數(shù)據(jù)發(fā)送完成后取消片選
*************************************************************************************************************/
#include"system.h"
#include"spi.h"
#include"delay.h"
//SPI通道數(shù)量
#defineSPI_CH_N2
//SPI外設(shè)結(jié)構(gòu)
constSPI_TypeDef*SPI_CH[SPI_CH_N]={SPI0,SPI1};
//默認(rèn)模式1
//主設(shè)備模式,空閑時(shí)鐘低電平,第一個(gè)時(shí)鐘邊沿有效(上升沿有效),使能發(fā)送接收,數(shù)據(jù)寬度8bit,關(guān)閉DMA,使能手動(dòng)控制片選
constSPI_Config_TypeDefSPI_DEFAULT_01={0,0,0,1,1,8,0,0,0,0};
/*************************************************************************************************************************
*函數(shù):voidSPI_SetSpeed(u8ch,u8Speed)
*功能:設(shè)置SPI速度
*參數(shù):CH:SPI通道選擇;Speed:SPI速度設(shè)置
*返回:無(wú)
*依賴(lài):底層宏定義
*作者:cp1300@139.com
*時(shí)間:20121005
*最后修改時(shí)間:20121005
*說(shuō)明:修改的時(shí)候注意SPI應(yīng)該處于空閑或者無(wú)效狀態(tài),使用的時(shí)鐘是PCLK
*SPI時(shí)鐘輸出=時(shí)鐘源/(2×(預(yù)分頻值+1))
*************************************************************************************************************************/
voidSPI_SetSpeed(u8ch,u8Speed)
{
SPI_TypeDef*SPI;
if(ch>=SPI_CH_N)
return;//通道號(hào)超出范圍
SPI=(SPI_TypeDef*)SPI_CH[ch];//獲取對(duì)應(yīng)通道寄存器結(jié)構(gòu)指針
SPI->CLKCFG=0;//清空設(shè)置并關(guān)閉時(shí)鐘
SPI->CLKCFG=Speed;//設(shè)置預(yù)分頻值
SPI->CLKCFG|=BIT8;//使能時(shí)鐘
}
/*************************************************************************************************************************
*函數(shù):u8SPI_Init(u8ch,SPI_Config_TypeDef*config,u8Speed)
*功能:SPI初始化
*參數(shù):CH:SPI通道選擇;config:配置結(jié)構(gòu)指針;Speed:SPI速度設(shè)置
*返回:0:初始化成功;1:初始化失敗
*依賴(lài):底層宏定義
*作者:cp1300@139.com
*時(shí)間:20121005
*最后修改時(shí)間:20121005
*說(shuō)明:無(wú)
*************************************************************************************************************************/
u8SPI_Init(u8ch,constSPI_Config_TypeDef*config,u8Speed)
{
u32chcfg=0;
u32modcfg=0;
u32slavecfg=0;
SPI_TypeDef*SPI;
if(ch>=SPI_CH_N)
return1;//通道號(hào)超出范圍
SPI=(SPI_TypeDef*)SPI_CH[ch];//獲取對(duì)應(yīng)通道寄存器結(jié)構(gòu)指針
SPI->CHCFG|=BIT5;//SPI軟復(fù)位
Delay_US(10);//適當(dāng)延時(shí)
switch(ch)
{
case0://通道0
{
Set_GateClk(PCLK_SPI0,ENABLE);//使能SPI0門(mén)控時(shí)鐘
rGPCCON&=~0xfff;
rGPCCON|=0x222;//初始化SPI0MISOCLKMOSI相關(guān)IO
}break;
case1://通道1
{
Set_GateClk(PCLK_SPI1,ENABLE);//使能SPI1門(mén)控時(shí)鐘
rGPCCON&=~(0xfff<<16);
rGPCCON|=(0x222<<16);//初始化SPI1MISOCLKMOSI相關(guān)IO
}break;
default:break;
}
SPI->CLKCFG&=~BIT8;//關(guān)閉SPI時(shí)鐘
SPI->CHCFG=0;//清除設(shè)置并關(guān)閉SPI發(fā)送接收通道
if(config->EnSlave)//使能從設(shè)備模式
{
chcfg|=BIT4;
}
if(config->EnCPOH)//使能空閑時(shí)鐘高電平
{
chcfg|=BIT3;
}
if(config->EnCPHB)//使能第二個(gè)時(shí)鐘邊沿有效
{
chcfg|=BIT2;
}
if(config->EnRx)//使能接收
{
chcfg|=BIT1;
}
if(config->EnTx)//使能發(fā)送
{
chcfg|=BIT0;
}
switch(config->SetTranSize)//設(shè)置傳輸數(shù)據(jù)位寬
{
case16:modcfg|=(1<<29);modcfg|=(1<<17);break;//半字
case32:modcfg|=(2<<29);modcfg|=(2<<17);break;//字
default:break;//字節(jié)
}