你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
lslp 提问时间:2015-7-22 13:50 /
我用spi1作为主机,spi2作为从机,想实现收发数据,但是一直接收不打数据
新建位图图像.jpg
收藏 1 评论35 发布时间:2015-7-22 13:50

举报

35个回答
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.
}

st.png
snjeym 回答时间:2016-10-23 19:00:49

这个是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

能具体一点么?
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
这个注意到了,,而且你说的数据大小,函数参数里也有定义。。我刚才说错了,第二个参数是数据地址,第三 ...

个人建议拿示波器边调试边测量信号比较快,也容易查找问题所在。
123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版