最近在用STM32F031调试SPI,之前用STM32F103调试的时候还可以读到数据,也可以写数据,现在将程序移植到STM32F031上面,发现无法对数据进行读取,想请论坛里面的高手帮忙看下,我也搜了很多资料,说STM32F0的SPI和103的SPI配置有不一样的地方,是因为STM32F0多了FIFO,需要将FIFO配置成8位的,所以初始化的地方我已经改了,但是读写一个字节也是不一样的,求原子哥能否给一个STM32F0的SPI的例程(寄存器版本的)
我的配置是这样的:
[mw_shl_code=c,true]void SPI_InitConfigure(void) // 串行外设接口(SPI)初始化函数
{
/* SPI1复位 ---------------------------------------------------------------------------------------------*/
// RCC->APB2RSTR |= RCC_APB2RSTR_SPI1RST; // 将 RCC_APB2RSTR 的第 12 位置 1
// RCC->APB2RSTR &= ~RCC_APB2RSTR_SPI1RST; // SPI1停止复位
/* SPI1时钟使能 -----------------------------------------------------------------------------------------*/
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // SPI1时钟使能
/* SPI1 配置波特率控制 (Baud rate control) fPCLK/16 -----------------------------------------------------*/
SPI1->CR1 |= (0x06<<3); // fPCLK/128=375K
/* SPI1 配置成空闲状态时,SCK保持高电平 -------------------------------------------------------------------*/
SPI1->CR1 |= SPI_CR1_CPOL; // 将 SPI1_CR1 的第 1 位置 1
/* SPI1 配置成数据采样从第二个时间边沿开始,CPHA=1 ---------------------------------------------------------*/
SPI1->CR1 |= SPI_CR1_CPHA; // 将 SPI1_CR1 的第 0 位置 1
/* SPI1 配置成全双工模式 ----------------------------------------------------------------------------------*/
SPI1->CR1 &= ~SPI_CR1_RXONLY; // 将 SPI1_CR1 的第 10 位清零
/* SPI1 配置2线的单向数据模式------------------------------------------------------------------------------*/
SPI1->CR1 &= ~SPI_CR1_BIDIMODE;
/* SPI1 数据位为8位----------------------------------------------------------------------------------------*/
SPI1->CR2 |= (0x07<<7); // 配置数据位为8位数据
/* SPI1 配置帧格式 (Frame format) 0:先发送 MSB ----------------------------------------------------------*/
SPI1->CR1 &= ~SPI_CR1_LSBFIRST; // 将 SPI1_CR1 的第 7 位清零
/* SPI1 配置成启用软件从设备管理 --------------------------------------------------------------------------*/
SPI1->CR1 |= SPI_CR1_SSM; // 将 SPI1_CR1 的第 9 位置 1
/* SPI1 内部从设备选择 ------------------------------------------------------------------------------------*/
SPI1->CR1 |= SPI_CR1_SSI; // 将 SPI1_CR1 的第 8 位置 1
/* SPI1 FRXTH位的配置--------------------------------------------------------------------------------------*/
SPI1->CR2 |= SPI_CR2_FRXTH; //FIFO的设置
/* SPI1 配置为主设备 --------------------------------------------------------------------------------------*/
SPI1->CR1 |= SPI_CR1_MSTR; // 将 SPI1_CR1 的第 2 位置 1
/* SPI1 配置成使用8位数据帧格式进行发送/接收 --------------------------------------------------------------*/
// SPI1->CR1 &= ~(0x01<<11); // 将 SPI1_CR1 的第 11 位清 0
/* SPI1 开启SPI设备 ---------------------------------------------------------------------------------------*/
SPI1->CR1 |= SPI_CR1_SPE; // 将 SPI1_CR1 的第 6 位置 1
}[/mw_shl_code]
我的SPI读写一个字节的程序
u8 SPI_ReadWriteByte(SPI_TypeDef* SPIx,u8 TxData)
[mw_shl_code=c,true]{
u16 retry=0;
u32 spixbase = 0x00;
while((SPI1->SR && SPI_SR_TXE)==0) // 等待发送区空
{
retry++;
if(retry>0XFFFE)
return 0;
}
/* Check the parameters */
// assert_param(IS_SPI_ALL_PERIPH(SPIx));
spixbase = (uint32_t)SPIx;
spixbase += 0x0C;
*(__IO uint8_t *) spixbase = TxData;
retry = 0;
while((SPI1->SR && SPI_SR_RXNE)==0) // 等待接收完一个 byte
{
retry++;
if(retry>0XFFFE)
return 0;
}
spixbase = (uint32_t)SPIx;
spixbase += 0x0C;
return *(__IO uint8_t *) spixbase;
}[/mw_shl_code]
感觉初始化配置是没有问题的,用SPI读写一个字节的程序是有问题的,但是我不知道怎么去写,希望有高手指点下,或者给个例程给我,在线等 谢谢
|