stm32 io模擬spi通信

首先借鑑他人的編寫程序:

#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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章