OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3895|回复: 5

STM32控制MAX197

[复制链接]

13

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2015-3-8
在线时间
1 小时
发表于 2015-7-27 02:01:52 | 显示全部楼层 |阅读模式
5金钱
#include "max197.h"
#include "delay.h"
#include "usart.h"

void MAX197_Init()
{
//JTAG_Set(JTAG_SWD_DISABLE); //必须关闭JTAG,有IO复用
RCC->APB2ENR|=1<<7;      //使能PA时钟
GPIOF->CRL&=0x00000000;
GPIOF->CRL|=0x33333333;
GPIOF->CRH&=0x00000fff;
GPIOF->CRH|=0x83333000;
GPIOF->ODR|=0x78ff;
}
//Channel:通道x, 0~7
u16 MAX197_Read(u8 Channel)
{
u16 temp;
MAX197_CS=0;

MAX197_WR=0;
MAX197_DATA(0x40|Channel); //正常操作,内部时钟,0~5V,通道0
MAX197_CS=1;
MAX197_WR=1;
while(MAX197_INT);

// GPIOA->CRL&=0x00000000;
// GPIOA->CRL|=0x88888888;
PAL_IN();        //浮空输入也行,模拟输入不行

MAX197_CS=0;

MAX197_RD=0;
MAX197_HBEN=1; //读高四位
temp=GPIOF->IDR&0x0f;
temp<<=8;
MAX197_HBEN=0;  //读低八位
temp|=(GPIOF->IDR&0xff);

// GPIOA->CRL&=0x00000000;
// GPIOA->CRL|=0x33333333;
PAL_OUT();

MAX197_CS=1;

return temp;
}
double MAX197_GetVol(u8 Channel) //读取10次求平均值
{
double vol;
u16 temp=0,i;
for(i=0;i<10;i++)
{
temp+=MAX197_Read(Channel);
}
vol=(double)temp/10.0/4095.0*5.0;
return vol;
}

#ifndef __MAX197_H
#define __MAX197_H

#include "sys.h"
#include "stm32f10x.h"
#define PAL_OUT() {GPIOF->CRL&=0x00000000;GPIOF->CRL|=0x33333333;}
#define PAL_IN()  {GPIOF->CRL&=0x00000000;GPIOF->CRL|=0x88888888;}

#define MAX197_DATA(x) GPIOF->ODR=(GPIOF->ODR&0Xff00)|(x&0x00ff)//PA低8位数据输出

#define MAX197_CS   PFout(11)
#define MAX197_WR   PFout(12)
#define MAX197_RD   PFout(13)
#define MAX197_HBEN PFout(14)
#define MAX197_INT  Fin(15)

void MAX197_Init(void);
u16 MAX197_Read(u8 Channel);
double MAX197_GetVol(u8 Channel);

//MAX197寄存器设置:
//      控制字格式:
//      D7(MSB)  D6     D5     D4     D3      D2     D1     D0(LSB)
//        D1    D0  ACQMOD   RNG    BIP     A2     A1     A0                 
//      控制字说明:
//          D1,PD0 ----- 选择时钟和掉电模式
//           ACQMOD ----- 0:内部获取模式;1:外部获取模式
//              RNG ----- 选择满幅输入电压
//              BIP ----- 选择输入极性
//         A2,A1,A0 ----- 选择输入通道
//                            
//          D1,PD0 ----- 00:一般模式/外部时钟
//                        01:一般模式/内部时钟
//                        10:Standby Power-Down/时钟不受影响
//                        11:Full Power-Down (FULLPD)/时钟不受影响
//                                               
//          RNG,BIP ----- 00: 0V ~  +5V
//                        01:-5V ~  +5V
//                        10: 0V ~ +10V
//                        11:-10V~ +10V
//                                                
//         A2,A1,A0 ----- 000:CH0
//                        001:CH1
//                        010:CH2
//                        011:CH3
//                        100:CH4
//                        101:CH5
//                        110:CH6
//                        111:CH7      
//*******************************************
#endif
谁能帮我看一下?为什么完全读不到数据?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

598

帖子

0

精华

高级会员

Rank: 4

积分
875
金钱
875
注册时间
2013-12-18
在线时间
41 小时
发表于 2015-7-27 08:04:15 | 显示全部楼层
回复

使用道具 举报

13

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2015-3-8
在线时间
1 小时
 楼主| 发表于 2015-8-3 16:05:21 | 显示全部楼层
自己有重新编写了一遍,还是不行

#define AL_OUT() {GPIO_Set(GPIOA,PIN0|PIN1|PIN2|PIN3|PIN4|PIN5|PIN6|PIN7,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_2M,GPIO_PUPD_NONE);}
#define AL_IN()  {GPIO_Set(GPIOA,PIN0|PIN1|PIN2|PIN3|PIN4|PIN5|PIN6|PIN7,GPIO_MODE_IN,0,0,GPIO_PUPD_PU);}

#define MAX197_DATA(x) GPIOA->ODR=(GPIOA->ODR&0Xff00)|(x&0x00ff)//PA??8??????????

#define MAX197_CS   Aout(11)
#define MAX197_WR   Aout(12)
#define MAX197_RD   Aout(13)
#define MAX197_HBEN Aout(14)
#define MAX197_INT  Ain(15)

u16 MAX197_Read(u8 Channel)
{
u16 temp1,temp2;
u16 temp;
PAL_OUT();
MAX197_CS=0;
MAX197_WR=0;
delay_us(1);
MAX197_DATA(0x58|Channel);  //??????×÷???????±????0~5V,?¨??0

delay_us(1);

MAX197_WR=1;
while(MAX197_INT);

PAL_IN();        //??????????????????????????

MAX197_RD=0;

MAX197_HBEN=0;  //????°???
temp1=(GPIOA->IDR&0xff);
MAX197_HBEN=1;
temp2=(GPIOA->IDR&0x0f)<<8;
MAX197_HBEN=0;

MAX197_RD=1;
temp=temp1+temp2;
MAX197_CS=1;

return temp;
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-8-3 22:38:51 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

45

帖子

0

精华

高级会员

Rank: 4

积分
772
金钱
772
注册时间
2012-12-12
在线时间
272 小时
发表于 2018-5-8 22:29:59 | 显示全部楼层
hnsdyd 发表于 2015-8-3 16:05
自己有重新编写了一遍,还是不行

#define&nbspAL_OUT()&nbsp;{GPIO_Set(GPIOA,PIN0|PIN1|PIN2|PIN3|PIN4 ...

解决了吗
回复

使用道具 举报

13

主题

45

帖子

0

精华

高级会员

Rank: 4

积分
772
金钱
772
注册时间
2012-12-12
在线时间
272 小时
发表于 2018-5-8 22:30:25 | 显示全部楼层
hnsdyd 发表于 2015-8-3 16:05
自己有重新编写了一遍,还是不行

#define&nbspAL_OUT()&nbsp;{GPIO_Set(GPIOA,PIN0|PIN1|PIN2|PIN3|PIN4 ...

我能调通但是读取通道不对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 00:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表