OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4042|回复: 4

STM32L476 SPI MISO无输出

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-5-18
在线时间
7 小时
发表于 2018-4-12 16:42:04 | 显示全部楼层 |阅读模式
5金钱
现在的现象,自己做的板子,使用的是STM32L476这款芯片,通过SPI接口控制MB85铁电存储器,用示波器观察MOSICSCLKMISO引脚,发现CSMOSICLK这三个引脚的波形图都正确,但是MISO引脚却始终为低电平。
[mw_shl_code=applescript,true]#define MB85_WREN_INST  0x06                //éèÖÃD′ê1ÄüËø′æÆ÷        //MB85RS256A?????
#define MB85_WRDI_INST  0x04                //D′½ûÖ1
#define MB85_RDSR_INST  0x05                //¶á×′쬼Ä′æÆ÷
#define MB85_WRSR_INST  0x01                //D′×′쬼Ä′æÆ÷
#define MB85_READ_INST  0x03                //¶á′æ′¢Æ÷êy¾Y
#define MB85_WRITE_INST 0x02                //D′′æ′¢Æ÷êy¾Y
#define MB85_STATUS_REG 0x0                //
#define MB85_INIT_STATE 0x09                //
#define MB85_RDID_INST  0x9F                //¶áÆ÷¼tID
#define MB_CS_L                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET)
#define MB_CS_H                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET)

/* USER CODE END 0 */

SPI_HandleTypeDef hspi1;

/* SPI1 init function */
void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(spiHandle->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspInit 0 */
        __HAL_RCC_GPIOB_CLK_ENABLE();
  /* USER CODE END SPI1_MspInit 0 */
    /* SPI1 clock enable */
    __HAL_RCC_SPI1_CLK_ENABLE();
   
    /**SPI1 GPIO Configuration   
    PB3 (JTDO-TRACESWO)     ------> SPI1_SCK
    PB4 (NJTRST)     ------> SPI1_MISO
    PB5     ------> SPI1_MOSI
    */
    GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

         
  /* USER CODE BEGIN SPI1_MspInit 1 */
//      GPIO_InitStruct.Pin = GPIO_PIN_4;
//    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
//    GPIO_InitStruct.Pull = GPIO_NOPULL;
//    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
//    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
//    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
         
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
        GPIO_InitStruct.Pin=GPIO_PIN_1;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
  /* USER CODE END SPI1_MspInit 1 */
  }
}

void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
{

  if(spiHandle->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspDeInit 0 */
        __HAL_RCC_GPIOB_CLK_DISABLE();
  /* USER CODE END SPI1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_SPI1_CLK_DISABLE();
   
    /**SPI1 GPIO Configuration   
    PB3 (JTDO-TRACESWO)     ------> SPI1_SCK
    PB4 (NJTRST)     ------> SPI1_MISO
    PB5     ------> SPI1_MOSI
    */
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);

  /* USER CODE BEGIN SPI1_MspDeInit 1 */

  /* USER CODE END SPI1_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */
uint8_t SPI_FRAM_SendByte(uint8_t byte)
{
uint8_t d_read,d_send=byte;
if (HAL_SPI_TransmitReceive(&hspi1,&d_send,&d_read,1,0xFFFFFF)!=HAL_OK)
d_read=0xff;
return d_read;
}
void SPI_FRAM_BufferRead(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t NumByteToRead)
{
                /* Ñ¡ÔñFRAM: CS μíμçƽ*/
                MB_CS_L;
                /* ·¢Ëí¶áÖ¸áî */
                SPI_FRAM_SendByte(MB85_READ_INST);
                /* ·¢Ëí¶áμØÖ·¸ßλ */
//              SPI_FRAM_SendByte((ReadAddr& 0xFF0000) >> 16);
                SPI_FRAM_SendByte((ReadAddr& 0x00FF00) >> 8);
                /* ·¢Ëí¶áμØÖ·μíλ */
                SPI_FRAM_SendByte(ReadAddr & 0x0000FF);
                while (NumByteToRead--) { /* ¶áè¡êy¾Y */
                *pBuffer = SPI_FRAM_SendByte(0x00);
                /* Ö¸ÏòÏÂò»¸ö×Ö½ú»o3åÇø */
                pBuffer++;
}
/* ½ûÖ1FRAM: CS ¸ßμçƽ */
MB_CS_H;
}
  
void SPI_FRAM_BufferWrite(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite)
{
                /* Ñ¡ÔñFRAM: CS μíμçƽ*/
                MB_CS_L;
                /* ·¢Ëí¶áÖ¸áî */
                SPI_FRAM_SendByte(MB85_WRITE_INST);
                /* ·¢Ëí¶áμØÖ·¸ßλ */
//              SPI_FRAM_SendByte((WriteAddr& 0xFF0000) >> 16);
                SPI_FRAM_SendByte((WriteAddr& 0x00FF00) >> 8);
                /* ·¢Ëí¶áμØÖ·μíλ */
                SPI_FRAM_SendByte(WriteAddr & 0x0000FF);
                while (NumByteToWrite--) { /* ¶áè¡êy¾Y */
                SPI_FRAM_SendByte(*pBuffer++);
                /* Ö¸ÏòÏÂò»¸ö×Ö½ú»o3åÇø */
}
/* ½ûÖ1    FRAM: CS ¸ßμçƽ */
                MB_CS_H;
}
  
uint8_t SPI_read_MB85(uint32_t address)//¶áè¡ìض¨μØÖ·μÄêy¾Y
{
        uint8_t dat,addr_tempH,addr_tempL,addr_tempM;
                addr_tempH = (uint8_t)((address&0xff0000)>>16);
        addr_tempM = (uint8_t)((address&0x00ff00)>>8);
        addr_tempL = (uint8_t)(address&0x0000ff);
        MB_CS_L;
        SPI_FRAM_SendByte(MB85_READ_INST);      //¶á′æ′¢Æ÷¼Ä′æÆ÷2ù×÷Âë
        SPI_FRAM_SendByte(addr_tempH);
                SPI_FRAM_SendByte(addr_tempM);
        SPI_FRAM_SendByte(addr_tempL);
        dat=SPI_FRAM_SendByte(0xaa);               //¶áè¡êy¾Y,0xAA¸øóè¶áè¡êy¾YËùDèμÄê±Öó
        MB_CS_H;
        return (dat);
}

void SPI_write_MB85(uint8_t data,uint32_t address)//D′ò»¸ö×Ö½úμ½ìض¨μÄμØÖ·¿Õ¼ä
{
        uint8_t addr_tempH,addr_tempL,addr_tempM;
                addr_tempH = (uint8_t)((address&0xff0000)>>16);
        addr_tempM = (uint8_t)((address&0x00ff00)>>8);   //»ñ衸ß8λμØÖ·
        addr_tempL = (uint8_t)(address&0x0000ff);        //»ñè¡μí8λμØÖ·
        MB_CS_L;
        SPI_FRAM_SendByte(MB85_WRITE_INST);    //D′ê1Äü
        SPI_FRAM_SendByte(addr_tempH);            //D′èëμØÖ·
                SPI_FRAM_SendByte(addr_tempM);
        SPI_FRAM_SendByte(addr_tempL);            //
        SPI_FRAM_SendByte(data);                  //D′èëêy¾Y
        MB_CS_H;
}[/mw_shl_code]
main函数
[mw_shl_code=applescript,true]while (1)
{

      
  SPI_write_MB85(0x19,0x000011);
  value=SPI_read_MB85(0x000011);
      if(value==0x19)
      {
          HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);
      }
  HAL_Delay(10);
}[/mw_shl_code]
绿色为MOSI,橙色为SCK
F0000TEK.JPG F0001TEK.JPG F0002TEK.JPG F0003TEK.JPG F0005TEK.JPG F0006TEK.JPG F0007TEK.JPG

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-4-13 01:30:07 | 显示全部楼层
有可能你根本就没初始化FRAM成功,所以没应答
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-5-18
在线时间
7 小时
 楼主| 发表于 2018-4-16 14:00:24 | 显示全部楼层
正点原子 发表于 2018-4-13 01:30
有可能你根本就没初始化FRAM成功,所以没应答

您是说SPI初始化不正确导致FRAM无应答吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-4-17 01:57:08 | 显示全部楼层
cherishqwy 发表于 2018-4-16 14:00
您是说SPI初始化不正确导致FRAM无应答吗?

这是一个方面,还有可能是初始化有问题,时序不对,比如高低电平,相位之类的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-5-24
在线时间
19 小时
发表于 2024-8-22 16:01:58 | 显示全部楼层
顶一下,L4的 太坑了:@
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 08:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表