以前写过STM32F103ZET6驱动ADS8332的代码,不过是使用IO模拟SPI驱动的,在本博客前面可以查询。今天在STE_V2.1验证平台上编写了STM32F429BIT6驱动ADS8332的代码,本次使用了STM32F4的硬件SPI,使用SPI2。代码亲自测试,效果不错。鉴于在网上看到很多人在找STM32硬件SPI驱动ADS8332,在此贴出代码工大家参考。

/**
  * 函数功能:采集待测芯片电流取样电阻处理后的电压的ADS8332复位
  * 输入参数:无
  * 输出参数:无
  * 全局变量:无
  * 作者:LuJ
  * 修改日期:2015/09/02
  * 备注:无
  */
void DUT_Power_ADS8332_Reset(void)
{
ADS8332_POWER_SCK_OUT=0;
ADS8332_POWER_CS_OUT=1;//CS=1
ADS8332_POWER_MOSI_OUT=1;
ADS8332_POWER_CONVST_OUT=1;

ADS8332_POWER_RESET_OUT=1;
Delay_us(100);
ADS8332_POWER_RESET_OUT=0;//minimum  25ns
Delay_us(100);
ADS8332_POWER_RESET_OUT=1;//minimum  2us
Delay_us(100);
}

/**
  * 函数功能:采集待测芯片电流取样电阻处理后的电压的ADS8332模数转换器开始转换
  * 输入参数:无
  * 输出参数:无
  * 全局变量:无
  * 作者:LuJ
  * 修改日期:2015/09/02
  * 备注:CONVST信号下降沿开始采集
  */
void DUT_Power_ADS8332_Convst(void)
{
ADS8332_POWER_CS_OUT=1;//CS=1
ADS8332_POWER_CONVST_OUT=1;
Delay_us(100);
ADS8332_POWER_CONVST_OUT=0;//minimum 40ns
Delay_us(100);
ADS8332_POWER_CONVST_OUT=1;
}

/**
  * 函数功能:采集待测芯片电流取样电阻处理后的电压的ADS8332模数转换器读配置信息
  * 输入参数:无
  * 输出参数:读取配置数据
  * 全局变量:无
  * 作者:LuJ
  * 修改日期:2015/09/02
  * 备注:下降沿,D15:12 1100b  D11:D0 Don't care
  */
uint16_t DUT_Power_ADS8332_ReadCFR(void)
{
    uint16_t temp_a = ADS8332_READ_CFR;
uint16_t ConFR  = 0x0000;
   
    ADS8332_POWER_CS_OUT=0;//CS=0

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){;}//等待发送区空  
SPI_I2S_SendData(SPI2, temp_a); //通过外设SPIx发送一个数据
    Delay_us(100);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){;}//等待接收完 
    
    ConFR = SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据
    Delay_us(100);
    ADS8332_POWER_CS_OUT=1;//CS=1
 
return ConFR;
}

/**
  * 函数功能:采集待测芯片电流取样电阻处理后的电压的ADS8332模数转换器写配置信息
  * 输入参数:cfr_data:写入的配置数据
  * 输出参数:无
  * 全局变量:无
  * 作者:LuJ
  * 修改日期:2015/09/02
  * 备注:下降沿,D15:12 1110b  D11:D0 Don't care
  */
void DUT_Power_ADS8332_WriteCFR(uint16_t cfr_data)
{
    ADS8332_POWER_CS_OUT=0;//CS=0 
    cfr_data = (ADS8332_WRITE_CFR | (0x0fff&cfr_data));//0xE000=0b 1100 0000 0000 0000
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){;}//等待发送区空 
SPI_I2S_SendData(SPI2, cfr_data); //通过外设SPIx发送一个数据
    Delay_us(100);
    ADS8332_POWER_CS_OUT=1;//CS=1
}

/**
  * 函数功能:采集待测芯片电流取样电阻处理后的电压的ADS8332模数转换器通道选择
  * 输入参数:ADS8332_Channel_x:选择的通道
  * 输出参数:无
  * 全局变量:无
  * 作者:LuJ
  * 修改日期:2015/09/02
  * 备注:无
  */
void DUT_Power_ADS8332_ChannelSel(uint16_t ADS8332_Channel_x)

    ADS8332_POWER_CS_OUT=0;//CS=0

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){;}//等待发送区空  
    SPI_I2S_SendData(SPI2, ADS8332_Channel_x); //通过外设SPIx发送一个数据
    Delay_us(100);
    ADS8332_POWER_CS_OUT=1;//CS=1
}

/**
  * 函数功能:采集待测芯片电流取样电阻处理后的电压的ADS8332模数转换器ADC采集,读取数据
  * 输入参数:ADS8332_Channel_x:选择的通道
  * 输出参数:读取到的数据
  * 全局变量:无
  * 作者:LuJ
  * 修改日期:2015/09/02
  * 备注:无
  */
uint16_t DUT_Power_ADS8332_ReadData(uint16_t ADS8332_Channel_x)
{
uint8_t temp_a;
uint16_t ConFR = 0x0000;

DUT_Power_ADS8332_ChannelSel(ADS8332_Channel_x);
//channel sel

DUT_Power_ADS8332_Convst();

temp_a = ADS8332_POWER_EOC_IN;
while(!temp_a)
{
temp_a = ADS8332_POWER_EOC_IN;
}
//check convert over

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){;}
ADS8332_POWER_CS_OUT=0;//CS=0
    SPI_I2S_SendData(SPI2, ADS8332_READ_DATA);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){;} 
    ConFR = SPI_I2S_ReceiveData(SPI2);//读出一次数据扔掉,该次数据不对
    ConFR = SPI_I2S_ReceiveData(SPI2);//返回通过SPIx最近接收的数据
    Delay_us(100);
    ADS8332_POWER_CS_OUT=1;//CS=1

return ConFR;
}

/**
  * 函数功能:采集待测芯片电流取样电阻处理后电压的ADS8332初始化
  * 输入参数:无
  * 输出参数:无
  * 全局变量:无
  * 作者:LuJ
  * 修改日期:2015/09/01
  * 备注:无
  */
void DUT_Power_ADS8332_Init(void)
{
    uint16_t cfr_old_config=0x0000,cfr_config=0x0000;
    
    SPI_InitTypeDef  SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
        
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOG, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//采样启动信号CONVST
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//复位信号RESET
GPIO_Init(GPIOG, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//CS;
GPIO_Init(GPIOG, &GPIO_InitStructure);
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//采样结束标志信号EOC
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOG, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2); //PB13复用为 SPI2
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2); 
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2);

// Data on the DO and DIO pins are clocked out on the falling edge of CLK.
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);

/* Enable SPI2  */
SPI_Cmd(SPI2, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_15;//SCK MOSI
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure); 
    
    DUT_Power_ADS8332_Reset();//复位ADS8332芯片
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//SCK MISO MOSI
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
    
cfr_old_config = (ADS8332_WRITE_CFR|ADS8332_INT_CLK|ADS8332_TR_MANUL|ADS8332_SMPL_250K|ADS8332_EOC_LOW\
|ADS8332_P10_EOC|ADS8332_P10_OUT|ADS8332_AUTONAP_DIS|ADS8332_NAP_DIS|ADS8332_PD_DIS|ADS8332_NOSW_RST);//配置工作模式0xE7FD,具体见手册
DUT_Power_ADS8332_WriteCFR(cfr_old_config);
    cfr_config=DUT_Power_ADS8332_ReadCFR();//读出一次数据扔掉,该次数据不对
    cfr_config=DUT_Power_ADS8332_ReadCFR();

while((0x0FFF&cfr_config) != (0x0FFF&cfr_old_config));//比较写入读出的配置相同,否则错误死循环,待特殊处理
}

/**
  * 函数功能:ADS8332采集待测芯片电流取样电阻处理后的电压
  * 输入参数:Power_Channal_x:电流通道选择
  *           DUT_Power_Channal_1       DUT供电通道1
  *           DUT_Power_Channal_2       DUT供电通道2
  *           DUT_Power_Channal_3       DUT供电通道3
  *           DUT_Power_Channal_4       DUT供电通道4
  *           DUT_Power_Channal_5       DUT供电通道5
  * 输出参数:无
  * 全局变量:无
  * 作者:LuJ
  * 修改日期:2015/09/01
  * 备注:无
  */
void DUT_Power_ADS8332_GetCurrentVal(uint8_t Power_Channal_x)
{
    uint16_t Current_1=0x0000,Current_2=0x0000;
    float Voltage_val;
    
    while(1)
    {
        Current_1=DUT_Power_ADS8332_ReadData(ADS8332_Channel_0);
        Voltage_val=((float)Current_1*4.096f)/65536.0f;
        printf("\r\n ADS8332_Channel_0=%6f  \r\n",Voltage_val);
        Current_2=DUT_Power_ADS8332_ReadData(ADS8332_Channel_1);
        Voltage_val=((float)Current_2*4.096f)/65536.0f;
        printf("\r\n ADS8332_Channel_1=%6f  \r\n",Voltage_val);
        Delay_ms(30);
    }
}

/**
  * 函数功能:TLV5618可调电源DAC输出测试
  * 输入参数:无
  * 输出参数:无
  * 全局变量:无
  * 作者:LuJ
  * 修改日期:2015/08/31
  * 备注:在主函数中调用,然后使用万用表测试Target的电源电压为3.3V
  */
void DUT_Power_Test(void)
{
    
   // DUT_TLV5618_Init();//初始化STM32的SPI2
    //DUT_TLV5618_Conver(0x0672,0x0672,TLV5618_Channal_AB,TLV5618_Fast_mode);//A通道输出,快速模式,电源控制位正常
    
    DUT_Power_ADS8332_Init();
    DUT_Power_ADS8332_GetCurrentVal(DUT_Power_Channal_1);

while (1)
{
;
}
}

STM32F4使用硬件SPI驱动ADS8322相关推荐

  1. stm32硬件SPI驱动3线SPI-LCD的方法

    1.基本控制原理 三线SPI LCD, 顾名思义,最少只需要3个IO控制LCD显示,如果采用硬件控制上电时序和背光,最少只需要接SCK,CS,MOSI三个引脚即可控制LCD,并且不管接不接其他引脚,控 ...

  2. MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动

    最近项目中用到了AD7793读取铂电阻值来得到相应的温度,编写了基于MSP430的硬件驱动程序和模拟驱动程序,并且能成功运行,现在记录一下分享给大家. AD7793硬件IIC驱动完整版下载链接:htt ...

  3. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  4. STM32使用硬件SPI驱动RC522门禁模块

    0.前言 RC522射频门禁识别模块非常常用,某宝卖家提供的程序基本都是使用软件模拟SPI的方式进行驱动的,但是实测使用软件模拟SPI识别速率.准确性没有硬件SPI驱动时高,因此本篇博客用于记录使用S ...

  5. 嵌入式开发-STM32硬件SPI驱动TFT屏

    嵌入式开发-STM32硬件SPI驱动TFT屏 这次用到的TFT屏 CubeMX设置 代码编写 增加的内容 需要注意问题 代码下载 这次用到的TFT屏 现在的TFT屏幕已经很便宜了,65536色屏幕,2 ...

  6. STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈

    STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈

  7. ESP8266+MicroPython开发:ESP8266使用硬件SPI驱动TFT屏幕(ST7735)

    由于上次模拟SPI驱动TFT屏幕太慢,所以,本次采用硬件SPI来进行驱动,但是,当我直接把对应SPI接口更换时,发现TFT屏幕驱动并没有因此得到好转,依然是非常的满,然后只能从对应花点铺色,显示字符串 ...

  8. 联盛德 HLK-W806 (十一): 软件SPI和硬件SPI驱动ST7567液晶LCD

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  9. STM32单片机基础17——使用硬件SPI驱动TFT-LCD(ST7789)

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SPI外设与ST7789通信,驱动16bit TFT-LCD 屏幕. 0. 前言 学习 SPI 外设驱动LCD屏幕没有 ...

  10. 联盛德 HLK-W806 (九): 软件SPI和硬件SPI驱动ST7789V液晶LCD

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

最新文章

  1. MSSQL - 因为数据库正在使用,所以无法获得对数据库的独占访问权。
  2. 成功解决Exception “unhandled ImportError“cannot import name ‘imresize‘ from ‘imageio‘
  3. kafka 启动_「首席看Event Hub」如何在您的Spring启动应用程序中使用Kafka
  4. Linux Vim多窗口编辑,Vim打开多个窗口方法详解
  5. 深入理解.NET Core的基元(三) - 深入理解runtimeconfig.json
  6. IOS – OpenGL ES 调节图像单色 GPUImageMonochromeFilter
  7. 如何减小电压跟随器输出电阻_气动操作器FBD5061SF-1蓝宇品牌安徽
  8. bobsmith电路阻抗原理_串联谐振原理全解析 - 赫兹电力
  9. WLAN 无线网络 02 - 频率、信道、编码、调制
  10. sqlserver 'sa'密码忘记,windows集成身份验证都登录不了解决办法
  11. ps之如何将做好的成品批量转换成图片导出
  12. 【项目难点】电商后台管理系统
  13. 3.33 利用快速蒙版制作选区 [原创Ps教程]
  14. 基于89C51单片机的智能小车——06.测速小车
  15. 初中数学分几个模块_初中数学所有概念! 初中数学一共可以分为几个模块,分别是什么?...
  16. Windows搭建幼麟麻将运行环境
  17. SDN南向接口和北向接口
  18. 第二届中国大数据安全高层论坛在贵阳举行
  19. spring tx:advice(转)
  20. 路由 OSPF常见4种网络类型MA、P2P、NBMA、P2MP、OSPF报头字段信息简介。

热门文章

  1. pt100专用芯片_T100/PT1000温度传感器芯片-PT100温度传感器芯片
  2. 查看php是否支持sg11,云虚拟主机支持SG11扩展
  3. Python Scrapy爬虫简单教程
  4. Chrome小恐龙游戏前端修改代码【含原理和代码】
  5. 阿里云免费ssl证书更换指南2021.4
  6. 使用 conda uninstall xxx时,一直卡在 Collecting package metadata (repodata.json)
  7. 物理系统——射线检测
  8. 小程序——添加动画,让图标原地旋转
  9. 运行navicat报出Missing required library libmysql_d.dll,126问题
  10. 基于阿里云的一般性系统安全措施介绍