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

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拉低了,可是时钟和数据都不对,想让大家帮忙看看是真么回事
大陶 回答时间: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
GKoSon 回答时间:2018-4-13 17:03:17
时钟不对 看看板子了

评分

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

查看全部评分

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

评分

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

查看全部评分

feixiang20 回答时间:2018-4-13 22:20:43
从波形看看默认速度,初始化数值写在初始化里看看之后运行情况

评分

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

查看全部评分

黑皮男 回答时间:2018-4-14 08:45:25
发送0xFF,其实是为了给SPI总线产生时钟,数据才能传输,所以,如果是软件CS的话,必须是在CS拉低发送才会有效

评分

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

查看全部评分

七哥 回答时间:2018-4-14 23:03:44
watercici 发表于 2018-4-13 11:23
抓取的图是这样的

这个图不大对呀,看一下实际SPI时钟是多少频率的?你设置的SPI时钟预期是多少频率?
你的4M时钟 够不够呢?要不你把SPI时钟分频降低一点,试试SPI_BaudRatePrescaler_256

评分

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

查看全部评分

watercici 回答时间:2018-4-15 15:13:11
toofree 发表于 2018-4-14 23:03
这个图不大对呀,看一下实际SPI时钟是多少频率的?你设置的SPI时钟预期是多少频率?
你的4M时钟 够不够呢 ...

谢谢,这个问题就是时钟的问题,后来改成256就可以了,谢谢!
watercici 回答时间:2018-4-15 15:14:08
结贴:这个抓取图中时钟不对的问题已经解决了,是SPI初始化中分频系数设置的不对的问题,有原来的4分频改为最低的256分频就可以了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

12下一页

所属标签

相似问题

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