最近在项目中有用到AD7193这款24bit的ADC芯片,在最对其驱动操作的过程中,花费了不少的时间,主要是对总线的时序了解不深,基础不牢所致,经此对其了解有所了然,故记录所感。
首先说明AD7193用的是SPI的MODE3模式!!,而不是通行的MODE0模式!!!。
且看下面数据手册给出的时序图:
了解到: SCK空闲状态时高电平, MOSI在第二个边沿(上升沿)移出数据。
-------------------------------------------------
CPOL=0表示,SCK在空闲状态时为0
CPOL=1表示,SCK在空闲状态时为1
CPHA=0表示,在SCK第一个边沿时输入输出数据有效
CPHA=1表示,在SCK第二个边沿时输入输出数据有效
MODE0 | CPOL=0 && CPHA=0
MODE1 | CPOL=0 && CPHA=1
MODE2 | CPOL=1 && CPHA=0
MODE3 | CPOL=1 && CPHA=1
-------------------------------------------------
可知CPOL=1,CPHA=1
-----SPI配置的代码
void MX_SPI3_Init(void)
{
hspi3.Instance = SPI3; //配置为SPI3
hspi3.Init.Mode = SPI_MODE_MASTER; //配置为Master
hspi3.Init.Direction = SPI_DIRECTION_2LINES;
hspi3.Init.DataSize = SPI_DATASIZE_8BIT; //8位数据模式
/*现在对CPOL&CPHA的配置 MODE3*/
hspi3.Init.CLKPolarity = SPI_POLARITY_HIGH; //CPOL=1
hspi3.Init.CLKPhase = SPI_PHASE_2EDGE; //CPHA=1
/*以前对CPOL&CPHA的配置 MODE0*/
// hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; //CPOL=0
// hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; //CPHA=0
hspi3.Init.NSS = SPI_NSS_SOFT; //NSS为软件控制
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;//配置SPI3分频系数 SPI最高频率有限制
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 7;
hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
if (HAL_SPI_Init(&hspi3) != HAL_OK) Error_Handler();
}
void stm32_spi_rw(unsigned char rw_mode,unsigned char *pdat,unsigned short int plen)
{
unsigned char stm=0x01;
//HAL_SPI_Transmit(&hspi3,&stm,1,0xFFFFF); /*Attention:加上这段代码 在配置的MODE0的情况下可以实现MODE3模式*/
if(0==rw_mode)
{
HAL_SPI_Receive(&hspi3,pdat,plen,0xFFFFF);
while (HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY);
}
else
{
HAL_SPI_Transmit(&hspi3,pdat,plen,0xFFFFF);
while (HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY);
}
}