打印
[STM32F0]

用HAL 库SPI无法读取数值

[复制链接]
14020|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zclic|  楼主 | 2015-12-21 11:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
spi, ni, TI, CRC, se
本帖最后由 zclic 于 2015-12-21 11:40 编辑

1.首先用IO 口来模拟SPI 通信,正常一点问题也没有。这就排除了硬件的问题。
2. 用STM32CubeMX 直接生成 SPI 代码。配置如下:
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLED;
  HAL_SPI_Init(&hspi1);

3. 程序第一次读取正常。再发送后读取就始终读回的都是00. 用示波器看波形数据都正常。就是读的时候波形是正确的。但就是
set_cs_low;
                HAL_SPI_Transmit(&hspi1, &tx_cmd, 1,100);
                        HAL_SPI_Receive(&hspi1,buffer,1,100);
set_cs_high

buffer 始终为0。感觉读不进数据一样。

有人有遇到这个问题吗?这个不是新库HAL的一个BUG吧。调适了一周多。N种办法都想过(中断,配置,延时,字长。etc。。)。都没有用
沙发
稳稳の幸福| | 2015-12-21 11:41 | 只看该作者
楼主用的是哪个开发板,自己做的吗?如果不是,是官方的,可以使用更牛X的,ARM的MBED在线开发,爽的很。不过我还不怎么会用,给你下一楼上SPI的操作方法。

使用特权

评论回复
板凳
zclic|  楼主 | 2015-12-21 11:44 | 只看该作者
自己的板。用ST-LINK仿真

使用特权

评论回复
地板
mmuuss586| | 2015-12-21 12:18 | 只看该作者

参考香水城版主,关于SPI握手的**;

使用特权

评论回复
5
mmuuss586| | 2015-12-21 12:19 | 只看该作者
6
zclic|  楼主 | 2015-12-21 12:41 | 只看该作者
本帖最后由 zclic 于 2015-12-21 12:48 编辑

谢谢 mmuuss586的意见。
应该不是这个问题。现在STM32作为主机接收,STM32自己发时钟怎么可能自己没有准备好?

使用特权

评论回复
7
zclic|  楼主 | 2015-12-21 13:50 | 只看该作者
hal 库没有人用吗?。这个问题应该不太可能只有我遇到吧?

使用特权

评论回复
8
zclic|  楼主 | 2015-12-21 15:55 | 只看该作者
顶一下吧。

使用特权

评论回复
9
1223657347| | 2015-12-21 20:13 | 只看该作者
直接操作寄存器吧。记得使能spi模块,记得注意字长

使用特权

评论回复
10
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
11
icecut| | 2015-12-21 20:26 | 只看该作者
##### How to use this driver #####
这里是写如何使用这个库的.
根据自动生成的代码进行确认.

看到下面这句话了么?
(#) Blocking mode API's are :
292          (++) HAL_SPI_Transmit()in 1Line (simplex) and 2Lines (full duplex) mode
293          (++) HAL_SPI_Receive() in 1Line (simplex) and 2Lines (full duplex) mode
294          (++) HAL_SPI_TransmitReceive() in full duplex mode

参考如下:http://antriver.com/stm32/STM32C ... f4xx_hal_spi.c.html

建议用294行的函数

使用特权

评论回复
12
迪卡| | 2015-12-21 21:55 | 只看该作者
会不会是master端和slave端不同步造成的

使用特权

评论回复
13
zclic|  楼主 | 2015-12-21 22:57 | 只看该作者
谢谢各位。我先试一下有进展。会及时通报给大家。谢谢

使用特权

评论回复
14
zclic|  楼主 | 2015-12-21 23:04 | 只看该作者
icecut 发表于 2015-12-21 20:26
##### How to use this driver #####
这里是写如何使用这个库的.
根据自动生成的代码进行确认.

HAL_SPI_TransmitReceive()  效果是一样的。没有区别。从库来看。这个函数跟HAL_SPI_Receive()也是一样的

使用特权

评论回复
15
sky.sun.zz| | 2015-12-22 07:41 | 只看该作者
楼主:发送完成数据后需要延时后才能够进行数据接收任务,虽然库操作过程已经判断的发送标志位等状态,但是此时数据传输仍在传输中。

使用特权

评论回复
16
zclic|  楼主 | 2015-12-22 10:53 | 只看该作者
延时一般多久呢?

使用特权

评论回复
17
zclic|  楼主 | 2015-12-22 11:10 | 只看该作者
延时500us也不行

使用特权

评论回复
18
zclic|  楼主 | 2015-12-23 10:36 | 只看该作者
本帖最后由 zclic 于 2015-12-23 10:38 编辑

                        while(HAL_SPI_GetState(&hspi1)!=HAL_SPI_STATE_READY)
                {
                                wait_us(2);
                }
                HAL_SPI_Transmit_IT(&hspi1, &tx_cmd, 1);
                while(HAL_SPI_GetState(&hspi1)!=HAL_SPI_STATE_READY)
                {
                                wait_us(2);
                }
                HAL_SPI_Receive_IT(&hspi1,buffer,len);难道SPI 是STM32的短板?

使用特权

评论回复
19
icecut| | 2015-12-23 10:38 | 只看该作者
你就发1个字节?你觉得这时候设备能响应么?设备回复你的肯定是空.

使用特权

评论回复
20
zclic|  楼主 | 2015-12-23 10:51 | 只看该作者
icecut 发表于 2015-12-23 10:38
你就发1个字节?你觉得这时候设备能响应么?设备回复你的肯定是空.

不是的。主机发一个字节后,从设备会返回一个数据过来。从波形上看。是从设备是有回复数据的。但STM32一直读到是00

使用特权

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

本版积分规则

3

主题

25

帖子

1

粉丝