lslp 发表于 2015-7-22 13:50:18

spi通信,一直接收不到数据

我用spi1作为主机,spi2作为从机,想实现收发数据,但是一直接收不打数据

andrewz 发表于 2016-10-24 12:21:07

SPI很简单的,给你贴一个我现在用的.

void Spi_init(SPI_TypeDef *p){
    RCC->APB2ENR|=RCC_APB2ENR_IOPAEN|RCC_APB2ENR_SPI1EN;
    GPIOA->CRL&=0x0000FFFF;                     //PA4 CS    /5 CLK      /6 MISO   /7 MOSI SPI.
    GPIOA->CRL|=0xB8B30000;                     //PA4 CS O/5 CLK AFO/6 MISO AFI /7 MOSI AFO.
    GPIOA->ODR|=GPIO_ODR_ODR4|GPIO_ODR_ODR5|GPIO_ODR_ODR6|GPIO_ODR_ODR7;    //CS H/MISO H.
    p->CR1|=SPI_CR1_MSTR;                     //master configuration.
    p->CR1|=SPI_CR1_DFF;                        //16-bit data frame format.
    p->CR1|=SPI_CR1_CPHA;                     //CPOL=0 CPHA=1. mode 1.
    p->CR1|=SPI_CR1_BR_1;                     //f_PCLK/8=9MHz.
    p->CR1|=SPI_CR1_SPE|SPI_CR1_SSM|SPI_CR1_SSI;//enable spi.
}

snjeym 发表于 2016-10-23 19:00:49

中山无雪 发表于 2016-10-21 23:39
初始化SPI有问题

这个是CUBE自动生成的初始化函数:
/* SPI1 init function */
static void MX_SPI1_Init(void)
{

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_128;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
    Error_Handler();
}

}

snjeym 发表于 2016-10-23 18:59:44

zbber 发表于 2016-10-21 17:58
HAL库里接收发送函数里面有存储数组,你只需要根据参数要求定义好接收位置即可 ...

这个接收位置的定义指的是什么?看示波器图片上,MISO是有波形的,且CLK的第一、二边沿都有1信号存在,所以即使CLK的相位不正确的话,也应该有1的存在,不会一直是0呀?

stary666 发表于 2015-7-22 14:02:22

寄存器没配置好

lslp 发表于 2015-7-22 14:09:13

stary666 发表于 2015-7-22 14:02
寄存器没配置好

能具体一点么?

creep 发表于 2015-7-22 14:20:33

HAL库函数HAL_SPI_Transmit里面就带有TXE标志位检测了,同样的HAL_SPI_Receive里面也有RXNE检测了,没有必要自己再去调用了吧。HAL库的特点就是把这些判断标志位的东西封装在了函数里面,要不和标准库就一样了。

lslp 发表于 2015-7-22 14:33:54

creep 发表于 2015-7-22 14:20
HAL库函数HAL_SPI_Transmit里面就带有TXE标志位检测了,同样的HAL_SPI_Receive里面也有RXNE检测了,没有必 ...

问题是我接收函数一直就收不到,我去掉while函数,依然就收不到数据

gronau 发表于 2015-7-22 14:38:31

HAL库里接收发送函数里面有存储数组,你只需要根据参数要求定义好接收位置即可。

lslp 发表于 2015-7-22 14:43:11

gronau 发表于 2015-7-22 14:38
HAL库里接收发送函数里面有存储数组,你只需要根据参数要求定义好接收位置即可。 ...

什么意思?我自己定义了一个数组,用来放接收的数据,HAL_SPI_receive函数的第三个参数不就是存放数据的地址么?

gronau 发表于 2015-7-22 14:49:50

lslp 发表于 2015-7-22 14:43
什么意思?我自己定义了一个数组,用来放接收的数据,HAL_SPI_receive函数的第三个参数不就是存放数据的 ...

你说的这个函数我用过,应该还有一个参数是配置接收个数的。仔细看一下。

gronau 发表于 2015-7-22 14:50:22

lslp 发表于 2015-7-22 14:43
什么意思?我自己定义了一个数组,用来放接收的数据,HAL_SPI_receive函数的第三个参数不就是存放数据的 ...

还有就是注意是8位还是16位通信啊。

creep 发表于 2015-7-22 14:53:51

lslp 发表于 2015-7-22 14:33
问题是我接收函数一直就收不到,我去掉while函数,依然就收不到数据

如果你想练手或者测试SPI的话建议还是直接连个外设比如外部FLASH或者SD卡模块,那样简单很多。

lslp 发表于 2015-7-22 14:58:54

creep 发表于 2015-7-22 14:53
如果你想练手或者测试SPI的话建议还是直接连个外设比如外部FLASH或者SD卡模块,那样简单很多。 ...

嗯嗯。。

lslp 发表于 2015-7-22 15:00:24

gronau 发表于 2015-7-22 14:50
还有就是注意是8位还是16位通信啊。

这个注意到了,,而且你说的数据大小,函数参数里也有定义。。我刚才说错了,第二个参数是数据地址,第三个参数是数据大小

lslp 发表于 2015-7-22 15:01:42

creep 发表于 2015-7-22 14:53
如果你想练手或者测试SPI的话建议还是直接连个外设比如外部FLASH或者SD卡模块,那样简单很多。 ...

我想用spi控制nrf24l01实现无线通信。做过吗?给提点意见

creep 发表于 2015-7-22 15:18:06

lslp 发表于 2015-7-22 15:01
我想用spi控制nrf24l01实现无线通信。做过吗?给提点意见

没做过,但是基本的SPI配置都是差不多的,根据nrf2410的SPI时序要求,把SPI的初始化,读写函数写好,剩下的就是配置nrf2410的部分了,这个应该有很多参考代码。

gronau 发表于 2015-7-22 15:18:11

lslp 发表于 2015-7-22 15:00
这个注意到了,,而且你说的数据大小,函数参数里也有定义。。我刚才说错了,第二个参数是数据地址,第三 ...

个人建议拿示波器边调试边测量信号比较快,也容易查找问题所在。
页: [1] 2 3
查看完整版本: spi通信,一直接收不到数据