OpenEdv-开源电子网

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

H743+VS1063,读写1063寄存器出错

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-8-28
在线时间
11 小时
发表于 2019-9-2 16:56:32 | 显示全部楼层 |阅读模式
1金钱
各位大神,最近在用H7搞1063,一开始1063reset就出问题了(读出来的数和自己写进去的不一样)。
abc3 返回的是0x55,abc4返回的是0

1063驱动F407可用,且示波器可看到H7,SPI时钟与发出的数据,烦请各路大神指点!
/* SPI2 init function */
void MX_SPI2_Init(void)
{
  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;    //1
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 7;
  hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  hspi2.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
  hspi2.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
  hspi2.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  hspi2.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  hspi2.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
  hspi2.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
  hspi2.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
  hspi2.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
  hspi2.Init.IOSwap = SPI_IO_SWAP_DISABLE;
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
  {
    Error_Handler();
  }

}
//使能SPI2
void VS1063_ON(void)
{
        LoadPluginStatus=0;

    /* Enable SPI2 */            
    SPI2->CR1 |= CR1_SPE_Set;
    SPI2->CR1|=1<<9;

}

//1063初始化
void VS1063Reset(void)
{
    VS1063_RESET_L;                                //xReset = 0   复位vs1003      
    HAL_Delay(100);        

    SPIPutUint16(0xffff);                        //打开SPI传输
   
    VS1063_XCS_H;                               //xCS = 1
                                         
    VS1063_RESET_H;                             //xRESET = 1
    HAL_Delay(100);                                   //延时100ms
    while (VS1063_DERQ== 0)    //等待DREQ为高
    {
        
    }
    HAL_Delay(100);

    VSTestInitSoftware();                        //测试寄存器
}
//测试寄存器
int VSTestInitSoftware(void)
{
  abc111 = ReadSci(SCI_MODE);
  WriteSci(SCI_HDAT0, 0xABAD);
  WriteSci(SCI_HDAT1, 0x1DEA);
  abc3=ReadSci(SCI_HDAT0);
  abc4=ReadSci(SCI_HDAT1);

  return 0;
}
//写寄存器
void WriteSci(u_int8 addr, u_int16 data)
{
    VS1063_BSYNC_H;
    VS1063_XCS_L;                //XCS = 0
    SPIPutUint16((VS_WRITE_COMMAND>>8) | addr);     //发送写寄存器命令
    SPIPutUint16(data);             //发送待写数据的16位
    Delay(3);
    VS1063_XCS_H;
    Delay(3);
}
//读寄存器
u_int16 ReadSci(u_int8 addr)
{
    uint16_t resultvalue = 0;
    VS1063_XCS_L;                //XCS = 0
    resultvalue = ((VS_READ_COMMAND<<8) | addr);
    SPIPutUint16(resultvalue);     //发送读寄存器命令
    resultvalue = SPIGetuint16();//读取16位数据
    Delay(3);   
    VS1063_XCS_H;
    return resultvalue;               //返回16位寄存器的值
}
//SPIPutUint16()
unsigned short    SPIPutUint16(unsigned short outb)
{
   /* Write and Read a byte on SPI interface. */
    unsigned short inb;
   /* Wait if TXE cleared, Tx FIFO is full. */
    while ((SPI2->SR & TXE) == 0);

   SPI2->TXDR = outb;
   
   /* Wait if RNE cleared, Rx FIFO is empty. */
    while ((SPI2->SR & RXNE) == 0);  
    inb = SPI2->RXDR;
    return (inb);
}
//SPIGetuint16()
uint16_t  SPIGetuint16(void)
{
  uint16_t Data = 0;
  /* Wait until the transmit buffer is empty */
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
  /* Send the byte */
  SPI_I2S_SendData(SPI2, 0xFFFF);       //SPIx->TXDR = Data;
  /* Wait until a data is received */
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
  /* Get the received data */
  Data = SPI_I2S_ReceiveData(SPI2);    //return SPIx->RXDR;
  Delay(10);  
  /* Return the shifted data */
  return Data;
}


最佳答案

查看完整内容[请看2#楼]

已解决,用原子的程序,初始化直接写寄存器,读取和发送时,强制转换成16位,否则移植维持32位不变
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-8-28
在线时间
11 小时
 楼主| 发表于 2019-9-2 16:56:33 | 显示全部楼层
已解决,用原子的程序,初始化直接写寄存器,读取和发送时,强制转换成16位,否则移植维持32位不变
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-9-3 02:45:56 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 11:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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