您的位置:首页 > 其它

stm32 io模拟spi通信

2016-05-06 16:54 369 查看
首先借鉴他人的编写程序:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: