初级会员

- 积分
- 154
- 金钱
- 154
- 注册时间
- 2014-11-30
- 在线时间
- 36 小时
|
5金钱
与RC522通信 会停在收发函数的
while((SPI2->SR & 1<<0)==0)
{
retry++;
if(retry>=0xfffe) return 0;
}
返回0
void SPI2_Init(void)
{
RCC->APB2ENR |= 1<<3;
RCC->APB1ENR |= 1<<14; //SPI2 CLOCK ENABLE
GPIOB->CRH &= 0X000FFFFF;
GPIOB->CRH |= 0XBBB00000; //复用推挽输出
GPIOB->ODR |= 0X07<<13; //PB13/14/15 pull up
SPI2->CR1 &= ~(1<<10); //全双工模式
SPI2->CR1 |= 1<<9; //Software slave management enable
SPI2->CR1 |= 1<<8;
SPI2->CR1 |= 1<<2; //SPI Master
SPI2->CR1 &= ~(1<<11); //8位数据格式
SPI2->CR1 &= ~(1<<1); //空闲时SCK为0 CPOL=0
// SPI2->CR1 |= 1<<1;
SPI2->CR1 &= ~(1<<0); //数据采样从第1个时间边沿开始,CPHA=0
// SPI2->CR1 |= 1<<0;
SPI2->CR1 |= 7<<3; //Fsck=Fpck1/256 36M/256
SPI2->CR1 &= ~(1<<7); //MSBfirst
SPI2->CR1 |= 1<<6; //SPI2 ENABLE
SPI2_ReadWriteByte(0xff); //启动传输
}
//SPI2速度设置函数
//SpeedSet:0~7
//SPI速度=fAPB1/2^(SpeedSet+1)
//APB1时钟一般为36Mhzvoid SPI2_SetSpeed(u8 SpeedSet)
void SPI2_SetSpeed(u8 SpeedSet)
{
SpeedSet &= 0x07;
SPI2->CR1 &= 0xffc7;
SPI2->CR1 |= SpeedSet<<3;
SPI2->CR1 |= 1<<6;
}
//SPI2 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI2_ReadWriteByte(u8 TxData)
{
u16 retry=0;
while((SPI2->SR & 1<<1)==0)
{
retry++;
if(retry>=0xfffe) return 0; //超时退出
}
SPI2->DR = TxData;
retry = 0;
while((SPI2->SR & 1<<0)==0)
{
retry++;
if(retry>=0xfffe) return 0;
}
return SPI2->DR; //返回收到的数据
}
求大神解救
|
|