历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2018年09月10日 | STM32F4使用硬件SPI驱动ADS8322

发布者:mu22 来源: eefocus关键字:STM32F4  硬件SPI  驱动ADS8322 手机看文章 扫描二维码
随时随地手机看文章

以前写过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 引用地址:STM32F4使用硬件SPI驱动ADS8322

上一篇:STM32L1学习笔记04 晶振设置
下一篇:STM32硬件SPI驱动0.96寸的OLED

推荐阅读

等待州长批准的加利福尼亚州参议院法案对最近社交媒体上的言论机器人作出了规管措施:法案规定,为了影响政治投票或获取资金,创建和运营社交媒体“机器人”是非法的,除非明确表示它是机器人。这项名为加利福尼亚SB1001的法案,由州参议员罗伯特·赫兹伯格发起,他是民主党人,但机器人问题不是任何政党所特有的。 近期社交网络上的机器人操控选举问...
随着金融科技迅猛发展,软银愿景基金正加快相应的产业投资布局。 根据报道,软银集团旗下的愿景基金在公开市场面临极大挑战,已投资的新创公司上市后表现将影响到该公司1000亿美元的投资是否能够成功,且CEO孙正义或许要重新规划未来愿景基金的投资重点。愿景基金投资的金额及速度都十分快,目前已经花费超过700亿美元的金额投资新创公司,大部分受惠公司...
9月9日-11日,2020 CIOE中国光博会在深圳举办,本届展会上,激光雷达芯片和模组厂商洛微科技(LuminWave)展示了国内首款基于硅光OPA的200线纯固态成像级激光雷达(LiDAR)。 据了解,洛微科技早在今年1月的CES展上就推出了世界上尺寸最小的基于自研光芯片技术的MicroLiDAR传感器芯片,主要用于自动驾驶近距补盲和手势识别。此次洛微科技展示的激光雷达原...
这节课我们来写一个定时器的中断服务程序使用定时器来实现点灯计数查考资料就是第10章PWM TIMER我们先把这个结构图展示出来这个图的结构很好这里面肯定有一个clk(时钟),1 、每来一个clk(时钟)这个TCNTn减去12、 当TCNTn == TCMPn时,可以产生中断,也可以让对应的SPWM引脚反转,(比如说原来是高电平,发生之后电平转换成低电平)3、 TCNTn继续减1,...

史海拾趣

问答坊 | AI 解惑

大家好!高人过来出个主意呀!

现在要做个高速的图像传输缓冲,速度为100Mb/s,请大家推荐一个好的方案!谢谢先! FPGA+SDRAM方案可以吗?FPGA选那个型号好!…

查看全部问答∨

LPC1114F样片申请

你好!!我最近在搞ARM7单片机(LPC1114),我买的是一块板!!由于我最近用这款芯片在搞一个项目,灯光照明控制的,要做个最小系统!!今天,在网上看见贵公司提供LPC1114F样片!!在这里提交了这份申请表!!望贵公司批准!!谢谢!!  …

查看全部问答∨

MSP430修改中断优先级

如何把430的TA定时设为最高优先级…

查看全部问答∨

请问YL 2440的BIOS程序谁调试过?

调试YL2440的YLP2440_MON,用的是ADS1.2,H-JTAG。调试时总是在 main函数入口出就异常了,不再往下继续执行,请问谁遇到这个问题,不知道怎么解决?…

查看全部问答∨

驱动中使用__try快的链接错误问题

我在驱动开发中使用了__try __finally块后链接的时候会出现链接错误如下: unresolved external symbol __except_handler4 是不是少了哪个链接库,我链接的库有wdm.lib BufferOverflowK.lib wmilib.lib usbd.lib 求各位大侠指点!…

查看全部问答∨

Windows Mobile 鼠标问题

多普达和三星的机器很多用了轨迹球和一些感应器件,但是不知道怎么在Windows Mobile里面加上鼠标,调了一下lcd driver,但是还是没有达到理想的效果,能偶尔闪出鼠标指针,哪位做过Mobile鼠标的能来指点下?…

查看全部问答∨

IROM启动方式出问题

以前一直没用过IROM启动方式,现在在2450平台上弄IROM方式启动,编译的内核启动不了,麻烦大侠们帮忙看看哪里出问题了。 Read OS image to BootMedia Success waitforconnect INFO: OEMLaunch: Jumping to Physical Address 0x3020D2DCh (Virtual ...…

查看全部问答∨

eVC中有这样一个bug:当您使用 CWnd 类版本的 GetDC 方法和 ReleaseDC 方法 BUG: 内存泄漏。 如果打了SP4补丁,此问题是否修复?

eVC中有这样一个bug:当您使用 CWnd 类版本的 GetDC 方法和 ReleaseDC 方法 BUG: 内存泄漏。 如果打了SP4补丁,此问题是否修复? 参看微软的信息:http://support.microsoft.com/kb/819635/zh-cn…

查看全部问答∨

进程查询的终止条件

如何通过当前的进程结束引起该进程的父进程?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved