以前写过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)
{
;
}
}
上一篇:STM32L1学习笔记04 晶振设置
下一篇:STM32硬件SPI驱动0.96寸的OLED
推荐阅读
史海拾趣
为了进一步提高竞争力,AOTC开始寻求与上下游企业的合作。通过与原材料供应商、生产设备制造商以及销售渠道商建立紧密的合作关系,公司成功实现了产业链的整合,降低了生产成本,提高了生产效率。此外,公司还与其他科技公司开展战略合作,共同研发新产品,拓展新市场。
近年来,随着物联网、5G等技术的快速发展,电子行业面临着巨大的变革。Antiference公司敏锐地捕捉到这一趋势,及时调整战略方向,将研发重点转向物联网设备的电磁兼容性研究。通过不断创新和优化产品,Antiference成功抓住了物联网发展的机遇,实现了业务的快速增长。
随着时间的推移,Hoffman公司不断拓展其产品线,从最初的安全保护装置逐渐扩展到包括标准机箱机柜、冷却产品及各种定制化电气方案。为了满足全球客户的需求,Hoffman在多个地区建立了生产基地和研发中心,特别是在亚太地区,青岛的研发及制造中心成为公司全球化战略的重要一环。这一布局不仅提升了公司的生产效率,也确保了产品在全球范围内的快速响应和高质量服务。
Heatron LED Integration深知品质对于产品的重要性,因此从原材料采购到生产制造,每一环节都严格把关。公司建立了完善的质量管理体系,确保每一款LED产品都能达到国际最高标准。同时,公司还注重产品的性能优化,通过不断的研发和技术升级,提升产品的发光效率和使用寿命。这种对品质和性能的双重追求,使得Heatron LED Integration的产品在市场上享有极高的声誉。
随着虚拟现实(VR)、增强现实(AR)等技术的快速发展,微型显示技术的需求日益增加。一家新兴显示技术公司,凭借其在微纳加工和光学设计方面的技术优势,成功研发出了高性能的微型显示屏。这种显示屏具有体积小、分辨率高、功耗低等特点,为VR/AR设备提供了更加逼真的视觉体验。
你好!!我最近在搞ARM7单片机(LPC1114),我买的是一块板!!由于我最近用这款芯片在搞一个项目,灯光照明控制的,要做个最小系统!!今天,在网上看见贵公司提供LPC1114F样片!!在这里提交了这份申请表!!望贵公司批准!!谢谢!! … 查看全部问答∨ |
|
调试YL2440的YLP2440_MON,用的是ADS1.2,H-JTAG。调试时总是在 main函数入口出就异常了,不再往下继续执行,请问谁遇到这个问题,不知道怎么解决?… 查看全部问答∨ |
我在驱动开发中使用了__try __finally块后链接的时候会出现链接错误如下: unresolved external symbol __except_handler4 是不是少了哪个链接库,我链接的库有wdm.lib BufferOverflowK.lib wmilib.lib usbd.lib 求各位大侠指点!… 查看全部问答∨ |
多普达和三星的机器很多用了轨迹球和一些感应器件,但是不知道怎么在Windows Mobile里面加上鼠标,调了一下lcd driver,但是还是没有达到理想的效果,能偶尔闪出鼠标指针,哪位做过Mobile鼠标的能来指点下?… 查看全部问答∨ |
以前一直没用过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… 查看全部问答∨ |