新手上路
- 积分
- 48
- 金钱
- 48
- 注册时间
- 2018-8-28
- 在线时间
- 11 小时
|
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;
}
|
|