STM32通过io模拟SPI与ADC124S021通信

简介: STM32通过io模拟SPI与ADC124S021通信

1 引脚定义

unsigned char ch_temp;

#define AD_FF 1

#define AD_ZF 2

#define AD_MF 3

#define AD_GM 4

#define ADC124S21_CS_PA4_OUT                GPIO_Pin_4            //使用PA4作为输出,控制ADC124S21芯片的片选

#define ADC124S21_CLK_PA5_SCK               GPIO_Pin_5         //使用PA5作为输出,模拟用作ADC124S21的CLK

#define ADC124S21_DATA_PA7_DIN            GPIO_Pin_7       //使用PA7作为输出,连接ADC124S21的DIN

#define ADC124S21_DATA_PA6_DOUT             GPIO_Pin_6                 //使用PA6作为输入,连接ADC124S21的DOUT

2 define 高低电平

#define AD_CS_H GPIO_SetBits(GPIOA,ADC124S21_CS_PA4_OUT)

#define AD_CS_L GPIO_ResetBits(GPIOA,ADC124S21_CS_PA4_OUT)

#define AD_DIN_H GPIO_SetBits(GPIOA,ADC124S21_DATA_PA7_DIN)

#define AD_DIN_L GPIO_ResetBits(GPIOA,ADC124S21_DATA_PA7_DIN)

#define AD_SCLK_H GPIO_SetBits(GPIOA,ADC124S21_CLK_PA5_SCK)

#define AD_SCLK_L GPIO_ResetBits(GPIOA,ADC124S21_CLK_PA5_SCK)

#define AD_DOUTGPIO_ReadInputDataBit(GPIOA, ADC124S21_DATA_PA6_DOUT)

3 gpio口的配置

/**

  • 配置用于操作ADC124S21的模拟SPI GPIO端口

*/

int U11ADC124S021_GPIO_init()

{ GPIO_InitTypeDef ADC124S21_GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

ADC124S21_GPIO_InitStructure.GPIO_Pin  = ADC124S21_CS_PA4_OUT;   //片选引脚配置

ADC124S21_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

ADC124S21_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_Init(GPIOA, &ADC124S21_GPIO_InitStructure);

GPIO_SetBits(GPIOA,ADC124S21_CS_PA4_OUT);

ADC124S21_GPIO_InitStructure.GPIO_Pin  = ADC124S21_CLK_PA5_SCK;   //时钟引脚配置

ADC124S21_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

ADC124S21_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_Init(GPIOA, &ADC124S21_GPIO_InitStructure);

ADC124S21_GPIO_InitStructure.GPIO_Pin  = ADC124S21_DATA_PA7_DIN;   //DIN引脚配置

ADC124S21_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

ADC124S21_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_Init(GPIOA, &ADC124S21_GPIO_InitStructure);

ADC124S21_GPIO_InitStructure.GPIO_Pin  = ADC124S21_DATA_PA6_DOUT;  //DOUT引脚配置

ADC124S21_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

ADC124S21_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输出

GPIO_Init(GPIOA, &ADC124S21_GPIO_InitStructure);

return 0;

}

4 ad转换函数

/********************************************************************************************************

**函数名称:U11_AD_124S021()

**函数功能:用于AD转换

**输入变量:channel 通道数;channel=1,则选择通道1;channel=2,则选择通道2.

**输出变量:ad_val,AD转换值

********************************************************************************************************/

u32 U11_AD_124S021(unsigned char channel)

{ unsignedchar ch = 0;

unsigned char i;

unsigned int ad_val=0;                                //AD转换值

AD_SCLK_H;                                //时钟输入端置高

AD_CS_L;                                              //片选控制端置低,AD转换使能

__nop();

__nop();

__nop();

if( channel == AD_FF )

ch = 0x00;   //选择通道1  聚焦值
复制代码

else if( channel == AD_ZF )

ch = 0x08;   //选择通道2  变倍值
复制代码

else if( channel == AD_MF )

ch = 0x10;   //选择通道3  天线电机值
复制代码

else if( channel == AD_GM )

ch = 0x18;   //选择通道4  光敏值
复制代码

ch_temp = ch;

for(i=0; i<8; i++)

{
   AD_SCLK_L;                                                             //时钟输入置低
   __nop();
   __nop();
   __nop();
   if((ch_temp&0x80)==0x00)
       AD_DIN_L;//通过串行方式输入通道选择
   else
       AD_DIN_H;
   ch_temp<<=1;
   AD_SCLK_H;                                                            //时钟输入置高,在此上升沿DIN实现1位输入
   __nop();
   __nop();
   __nop();
}
复制代码

for(i=0; i<8; i++)

{
   AD_SCLK_L;
   AD_SCLK_H;
}
复制代码

AD_CS_H;

ad_val=0;

AD_SCLK_H;

AD_CS_L;

__nop();

__nop();

__nop();

for(i=0; i<8; i++)

{
   ad_val=(ad_val<<1);
   AD_SCLK_L;
   __nop();
   __nop();
    __nop();
   if(AD_DOUT)
   {
       ad_val++;
   }
   else
   {
       __nop();
       __nop();
       __nop();
   }
   if((ch&0x80)==0x00)
       AD_DIN_L;
   else
       AD_DIN_H;
   ch<<=1;
   AD_SCLK_H;
   __nop();
   __nop();
   __nop();
}
复制代码

for(i=0; i<8; i++)

{
   ad_val=(ad_val<<1);
   AD_SCLK_L;
   __nop();
   __nop();
   __nop();
   if(AD_DOUT)
   {
        ad_val++;
   }
   else
   {
       __nop();
       __nop();
       __nop();
   }
   AD_SCLK_H;
}
复制代码

AD_CS_H;

ad_val=(ad_val&0x0fff);

//adtest=ad_val;
               returnad_val;
复制代码

}



相关文章
|
1月前
|
监控
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
|
1月前
stm32f407探索者开发板(十六)——串行通信原理讲解-UART
stm32f407探索者开发板(十六)——串行通信原理讲解-UART
|
1月前
stm32f407探索者开发板(十四)——IO引脚复用和映射
stm32f407探索者开发板(十四)——IO引脚复用和映射
|
1月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
|
2月前
|
开发者
【经典案例】使用HAL库配置STM32F407的SPI外设
在嵌入式系统开发中,STM32F407是一款广泛应用的微控制器,而SPI(Serial Peripheral Interface)是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层(HAL)库配置STM32F407的SPI外设,并提供完整的代码示例。
134 1
|
3月前
|
存储 缓存 芯片
|
3月前
|
存储 芯片
|
3月前
|
传感器 编解码 C语言
【软件设计师备考 专题 】IO设备、通信设备的性能,以及基本工作原理
【软件设计师备考 专题 】IO设备、通信设备的性能,以及基本工作原理
57 1
|
3月前
STM32--SPI通信与W25Q64(2)
STM32--SPI通信与W25Q64(2)
|
3月前
|
存储 传感器 芯片
STM32--SPI通信与W25Q64(1)
STM32--SPI通信与W25Q64(1)
115 0