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

SPI通信中的疑问

[复制链接]
watercici 提问时间:2018-4-13 11:03 /
我想问一下,SPI通信中初始化完成之后,到底用不用发送0xff来启动数据传输,还有就是初始化的时候我将片选信号置为无效,之后读写的时候才将片选信号拉低,那么如果用写0xFF来启动传输的话,这句是写在初始化中,还是写在每次读写时片选信号拉低之后呢?
<
收藏 评论15 发布时间:2018-4-13 11:03

举报

15个回答
watercici 回答时间:2018-4-13 11:18:51
本帖最后由 watercici 于 2018-4-13 11:22 编辑

这是我的初始化函数
void SPI2_Init(void)
{
        SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  
  /* Enable SPI2 and GPIO clocks */
  /*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,
       SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO
       and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);


  /*!< SPI_FLASH_SPI Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

  
  /*!< Configure SPI_FLASH_SPI pins: SCK PB13*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /*-------------------MISO PB14----------------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /*!< Configure SPI_FLASH_SPI pins: MOSI PB15*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
         
         /*----------SPI2_EEPROM_CS-----------------------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI2, &SPI_InitStructure);
        
  /* Enable SPI2 */
  SPI_Cmd(SPI2, ENABLE);
        
        SPI_I2S_SendData(SPI2,0xff);
  /* Deselect the FLASH: Chip Select high */
  SPI2_Flash_CS_HIGH();  
}
这是发送函数
void SPI2_Flash_SendByte(u8 dat)
{
        SPI_I2S_SendData(SPI2,dat);
        while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
}


现在就是发送的时候时钟不对,

watercici 回答时间:2018-4-13 11:23:15
抓取的图是这样的
图片1.jpg
MrJiu 回答时间:2018-4-13 11:33:58
软件CS?CS无效的时候,随便你发数据,从机是不会理会这些数据的,我看了半天不懂你想表达什么意思?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

watercici 回答时间:2018-4-13 11:35:33
MrJiu 发表于 2018-4-13 11:33
软件CS?CS无效的时候,随便你发数据,从机是不会理会这些数据的,我看了半天不懂你想表达什么意思? ...

我粘贴了程序,和逻辑分析仪的抓取结果,逻辑分析仪上CS拉低了,可是时钟和数据都不对,想让大家帮忙看看是真么回事
dataozi 回答时间:2018-4-13 12:01:55
先看看你使用的传感器的手册,不一定要通过0xff发送数据,

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

watercici 回答时间:2018-4-13 13:46:05
dataozi 发表于 2018-4-13 12:01
先看看你使用的传感器的手册,不一定要通过0xff发送数据,

传感器手册?我没有传感器,我用的是W25Q16的FLASH芯片
watercici 回答时间:2018-4-13 16:07:01
我知道是什么问题,是SPI分频系数设置的问题“SPI_BaudRatePrescaler”,我一开始是4分频,就没有时钟,后来改成256分频后,有时钟,也发送数据,可是没有回复,我又试了8,16,32,64,发现有时钟,但时钟周期不固定,回复的内容也会因时钟的不同而不同,请教一下SPI的分频系数应根据什么设定,设定多大呢。我选的芯片是W25Q16
与龙共舞 回答时间:2018-4-13 17:03:17
时钟不对 看看板子了

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

zhang547886405 回答时间:2018-4-13 21:42:28
建议用示波器看CLK波形,先确认下波形显示是否有问题,从逻辑分析仪显示的波形来看不正确,不排除逻辑分析仪有问题。我用我的板子试了下2分频,4分频都没问题

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版