首先借鑑他人的編寫程序:
#define MOSI_H GPIO_SetBits(GPIOB, GPIO_Pin_10)
#define MOSI_L GPIO_ResetBits(GPIOB, GPIO_Pin_10)
#define SCLK_H GPIO_SetBits(GPIOB, GPIO_Pin_13)
#define SCLK_L GPIO_ResetBits(GPIOB, GPIO_Pin_13)
#define MISO GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)
unsigned char SPI_SendByte(unsigned char dt)
{
u8 i;
u8 temp=0;
for(i=8;i>0;i--)
{
if(dt&0x80)MOSI_H;
else MOSI_L;
dt<<=1;
SCLK_H;
__nop();
__nop();
__nop();
temp<<=1;
if(MISO)temp++;
__nop();
__nop();
__nop();
SCLK_L;
}
return temp;
}
最後實現自己需要的一個spi主機程序,協議規定CPOL=1,CPHA=1,高位在前,地位在後發送
#define MOSI_H GPIO_SetBits(GPIOF, GPIO_Pin_2)
#define MOSI_L GPIO_ResetBits(GPIOF, GPIO_Pin_2)
#define SCLK_H GPIO_SetBits(GPIOF, GPIO_Pin_1)
#define SCLK_L GPIO_ResetBits(GPIOF, GPIO_Pin_1)
#define CS_H GPIO_SetBits(GPIOF, GPIO_Pin_0)
#define CS_L GPIO_ResetBits(GPIOF, GPIO_Pin_0)
void SPI_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, ENABLE); //使能PF端口時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; //PF 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推輓輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度爲50MHz
GPIO_Init(GPIOF, &GPIO_InitStructure); //根據設定參數初始化GPIOF
GPIO_SetBits(GPIOF,GPIO_Pin_0); //PF0 PF1 PF2 輸出高
GPIO_SetBits(GPIOF,GPIO_Pin_1);
GPIO_SetBits(GPIOF,GPIO_Pin_2);
}
unsigned char SPI_SendByte(unsigned char dt)
{
u8 i;
u8 temp=0;
for(i=8;i>0;i--)
{
CS_L;
if(dt&0x80)
MOSI_H;
else MOSI_L;
dt<<=1;
SCLK_L;
__nop();
__nop();
__nop();
__nop();
__nop();
__nop();
SCLK_H;
}
CS_H;
return temp;
}