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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版