watercici 发表于 2018-4-13 11:03:55

SPI通信中的疑问

我想问一下,SPI通信中初始化完成之后,到底用不用发送0xff来启动数据传输,还有就是初始化的时候我将片选信号置为无效,之后读写的时候才将片选信号拉低,那么如果用写0xFF来启动传输的话,这句是写在初始化中,还是写在每次读写时片选信号拉低之后呢?

watercici 发表于 2018-4-13 11:18:51

本帖最后由 watercici 于 2018-4-13 11:22 编辑

这是我的初始化函数
void SPI2_Init(void)
{
      SPI_InitTypeDefSPI_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

抓取的图是这样的

MrJiu 发表于 2018-4-13 11:33:58

软件CS?CS无效的时候,随便你发数据,从机是不会理会这些数据的,我看了半天不懂你想表达什么意思?

watercici 发表于 2018-4-13 11:35:33

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

我粘贴了程序,和逻辑分析仪的抓取结果,逻辑分析仪上CS拉低了,可是时钟和数据都不对,想让大家帮忙看看是真么回事

dataozi 发表于 2018-4-13 12:01:55

先看看你使用的传感器的手册,不一定要通过0xff发送数据,

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

时钟不对 看看板子了

zhang547886405 发表于 2018-4-13 21:42:28

建议用示波器看CLK波形,先确认下波形显示是否有问题,从逻辑分析仪显示的波形来看不正确,不排除逻辑分析仪有问题。我用我的板子试了下2分频,4分频都没问题
页: [1] 2
查看完整版本: SPI通信中的疑问