关于AD7193的SPI总线协议时序操作一感

本文介绍了在项目中使用AD7193 24bit ADC芯片时遇到的驱动问题,重点在于理解并配置SPI的MODE3模式。区别于常见的MODE0,MODE3的特点是SCK空闲时为高电平,数据在第二个边沿移出。代码示例展示了如何在STM32中初始化SPI3以匹配AD7193的MODE3配置,并提供了读写数据的函数。
摘要由CSDN通过智能技术生成

最近在项目中有用到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);	       
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值