使用的是spi接线方式,需要注意DB7数据线也就是MISO,接一根就行,也不需要给ad7606发数据。而且最重要的是DB15需要接地,是串口并口选择线,会影响数据的稳定性。
用cubemx生成stm32的工程然后用GD的库编译,生成时可以选择
/* SPI1 init function */
void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
SPI_DIRECTION_2LINES_RXONLY,只读,就少一根线。
SPI_DATASIZE_16BIT,数据16位模式,每次可以读两字节。
可以直接用16位数组读取8通道的数据。但是hal库spi接收函数是uint8_t,可以直接强转。因为配置的是16位宽,是所以返回的就是16位数据。
如下:
uint16_t adRxBuf_M1[8] = {0};
int16_t adRxData_M1[8] = {0};
void ad7606_IRQSrc(void)
{
uint8_t i=0;
AD_CS_L();
ad7606_RecvData(); //先读一次数据,再读8数据
HAL_SPI_Receive(&hspi1, (uint8_t*)adRxBuf_M1, 8, 10);
AD_CS_H();
for(i=0; i<8; i++)
{
adRxData_M1[i] = ((int32_t)5000)*((float)((short)adRxBuf_M1[i])/32768);
}
ad7606_StartConv();
}