打印
[STM32F0]

用HAL 库SPI无法读取数值

[复制链接]
14672|40
手机看帖
扫描二维码
随时随地手机跟帖
楼主
1223657347| | 2015-12-21 20:13 | 显示全部楼层 回帖奖励 |倒序浏览
直接操作寄存器吧。记得使能spi模块,记得注意字长

使用特权

评论回复
沙发
1223657347| | 2015-12-21 20:17 | 显示全部楼层
本帖最后由 1223657347 于 2015-12-21 20:29 编辑
uint8_t __ILI9341_IO_ByteWrite(uint8_t dat)
{
//        uint8_t temp;

//        HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*) &dat, &temp, 1, 1000);

//        return temp;
        
        while((SPI1->SR & (1<<1)) == 0)
                ; //等待发送区空
        
        *((__IO uint8_t *)(&SPI1->DR)) = dat;
        
        while(SPI1->SR & (1<<7))
                ; //Wait for not busy

        while((SPI1->SR & (1<<0)) == 0)
                ; //等待接收区非空
        
        return *((__IO uint8_t *)(&SPI1->DR));
}

uint8_t __ILI9341_IO_ByteRead(void)
{
        return __ILI9341_IO_ByteWrite(0xFF);
}

我这个是操作SPI接口的LCD驱动芯片的读写代码(基于STM32F070RB),HAL库和寄存器方式都是可以的用的,楼主试试能不能用
PS:用寄存器操作的话,一定要在初始化里使能SPI
__HAL_SPI_ENABLE(&SpiHandle);
并且更改FRXTH(单字节)
SPI1->CR2 |= (1)<<12;

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
zclic + 2
板凳
1223657347| | 2016-1-20 18:04 | 显示全部楼层
libingqing 发表于 2016-1-20 13:10
看了你的建议,使能SPI在初始化的代码中就存在,更改单字节,控制寄存器2的8到15位不是保留的么,那写1是 ...

在STM32F030,070参考手册内有这样一句话。
The read access must be always aligned with the RXFIFO threshold configured by the FRXTH bit in SPIx_CR2 register.(P649)
而FRXTH默认为0,即两个字节的宽度。直接读取DR寄存器,从FIFO中返回的是两个字节的数据,而在16位向8位的强行数据转换到时候,自然高位被丢弃,读取的数据就不对了。
给FRXTH置1,读操作会从接收FIFO中取单字节数据到DR去,这样就是单字节的访问。
用寄存器操作要注意DR寄存器的访问宽度。
希望有帮助:)

使用特权

评论回复
地板
1223657347| | 2016-1-21 12:33 | 显示全部楼层
libingqing 发表于 2016-1-21 09:40
好吧,我用的是F407的板子,没有找到RXFIFO 还是谢谢啦,我再看看是什么情况、、 ...

F4xx系列的SPI结构和F030x,F070x系列的并不一致。当然如果工程中使用的是HAL库的话,建议直接用CubeMX生成相应的初始化代码,读写的API也可以直接用。
相比于F030系列的SPI,F4系列的SPI是更容易操作的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则