打印
[应用相关]

STM32通信SPI,通信完成前为什么片选信号就会被拉高?

[复制链接]
507|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
七毛钱|  楼主 | 2021-5-11 16:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用STM32F103进行一项SPI通信实验,用示波器发现片选信号在通信中途会被拉高,而且总是剩余8byte数据时被拉高,如附件图所示(其中绿色是片选信号,粉色是时钟信号):
附件图中我发送3个字节,只有两个字节的片选信号正常,第三字节发送前片选信号就被拉高。我尝试发送过多个字节,也总是在最后一个字节前(8byte)片选信号被拉高。希望知道解决方法的大神帮助一下。
下面是我的代码:
int main(void)
{
            SPI_DAC_Init();
            DAC_SetVValue(2.8);
            while(1);
}

void SPI_DAC_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;      
  SPI_DAC_APBxclock_FUN ( SPI_DAC_CLK, ENABLE );


          /* 使能SPI引脚相关的时钟 */
        SPI_DAC_CS_APBxClock_FUN (       SPI_DAC_CS_CLK|SPI_DAC_SCK_CLK|SPI_DAC_MOSI_PIN, ENABLE );


  /* 配置SPI的 CS引脚,普通IO */
  GPIO_InitStructure.GPIO_Pin = SPI_DAC_CS_PIN;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(SPI_DAC_CS_PORT, &GPIO_InitStructure);


  /* 配置SPI的 SCK引脚*/
  GPIO_InitStructure.GPIO_Pin = SPI_DAC_SCK_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(SPI_DAC_SCK_PORT, &GPIO_InitStructure);

  /* 配置SPI的 MOSI引脚*/
  GPIO_InitStructure.GPIO_Pin = SPI_DAC_MOSI_PIN;
  GPIO_Init(SPI_DAC_MOSI_PORT, &GPIO_InitStructure);

  /* 停止信号 : CS引脚高电平*/
  SPI_DAC_CS_HIGH();

  /* SPI 模式配置 */
  // FLASH芯片 支持SPI模式0及模式3,据此设置CPOL CPHA
  SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
  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_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI_DAC , &SPI_InitStructure);

  /* 使能 SPI  */
  SPI_Cmd(SPI_DAC , ENABLE);

}

void SPI_DAC_Write(uint8_t *Data)
{
            uint8_t i=0;
            SPI_DAC_CS_LOW();
    /* 发送当前要写入的字节数据 */
            for(;i<3;i++)
            {      
                        SPI_DAC_SendByte(*Data);
                        Data++;
            }
            SPI_DAC_CS_HIGH();      
}

void SPI_DAC_SendByte(u8 byte)
{
            while(SPI_I2S_GetFlagStatus(SPI_DAC ,SPI_I2S_FLAG_BSY) == SET){}
  while (SPI_I2S_GetFlagStatus(SPI_DAC , SPI_I2S_FLAG_TXE) == RESET);
  SPI_I2S_SendData(SPI_DAC , byte);
}

void DAC_SetVValue(float VValue)
{
        uint8_t Value[]={0,0,0};
        VValueSet16Bits = VValue/5.0*65536;
        Value[0] = DAC_NORMAL_OPERATION;
        Value[1] = VValueSet16Bits / 0x100;
        Value[2] = VValueSet16Bits % 0x100;

        SPI_DAC_Write(Value);
}
如果对变量的定义有疑问,请留言给我,我会第一时间回复的。谢谢大家!

使用特权

评论回复
沙发
香水城| | 2021-5-12 11:11 | 只看该作者
到底是最后1个字节 还是8个字节?

片选是通过什么方式?NSS硬件模式 还是特定GPIO控制?

使用特权

评论回复
板凳
huquanz711| | 2021-5-12 19:14 | 只看该作者
你这个片选信号是软件控制的,还有没看到你对SPI-I2S的中断配置代码。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

341

主题

2328

帖子

4

粉丝