OpenEdv-开源电子网

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

stm32 外接mcp3204

[复制链接]

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-5-12
在线时间
0 小时
发表于 2013-5-23 15:04:40 | 显示全部楼层 |阅读模式
stm32内部有adc转换器,外面能再接一个带SPI 串行接口的2.7V, 4/8 通道12位A/D转换器(mcp3204)吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-23 18:08:34 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-5-12
在线时间
0 小时
 楼主| 发表于 2013-5-24 13:59:07 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我初学者,做这方面,原子哥有没有这方面的例程啊?或者只是涉及到MCP3204采集数据的例程啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-24 21:15:31 | 显示全部楼层
没哦
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-5-12
在线时间
0 小时
 楼主| 发表于 2013-5-28 23:09:09 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
请问STM32的引脚能不能做类似下面单片机的语句 
sbit MCPDI =P2^0;
MCPDI=(CH_CHOICE>>1)&0x01;
如果能,需要怎么写?
比如定义了一个 C0 ,应该怎么写?请赐教!
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-5-28 23:18:42 | 显示全部楼层
原子哥有这种位操作的。你看例程里就有,在sys.h好像
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-5-12
在线时间
0 小时
 楼主| 发表于 2013-5-29 11:21:59 | 显示全部楼层
回复【6楼】wwjdwy:
---------------------------------
怎么做啊?请赐教啊!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-29 17:39:52 | 显示全部楼层
回复【7楼】dagong184:
---------------------------------
看我的教程会不会啊?
<stm32不完全手册>或者<stm32开发指南>
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-5-12
在线时间
0 小时
 楼主| 发表于 2013-6-8 16:23:11 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
请问原子哥,我现在用的串口2,上电一次只能进入一次接收中断,再想进入就要重新上电,请问这种情况一般是什么问题啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-8 22:29:30 | 显示全部楼层
回复【9楼】dagong184:
---------------------------------
串口配置有问题.或者你串口没收到数据吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-5-12
在线时间
0 小时
 楼主| 发表于 2013-6-21 09:29:15 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
请问原子哥,这个编译出现的错误怎么解决..\Output\STM32-DEMO.axf: Error: L6218E: Undefined symbol NVIC_Init (referred from usart2.o).
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2013-6-21 11:29:16 | 显示全部楼层
我用的是mcp3424 也是IIC通信的。从国外的网站上才找到些例程,结果还是错的。也不能说是错吧,只是人家用的是硬件IIC,内部具体怎么实现的人家也不知道。我是用原子提供的普通脚来操作IIC的。我最后是硬着头皮看mcp的英文资料自己写的驱动,谁的例程也不看了,看了也没有用。最后搞定了,呵呵。
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-5-12
在线时间
0 小时
 楼主| 发表于 2013-6-21 13:35:23 | 显示全部楼层
回复【12楼】fanghuiopenedv:
---------------------------------
是吗,恭喜啊!能不能把你的程序共享一下啊!940985762@qq.com,   我学习学习!
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2013-6-21 23:25:42 | 显示全部楼层
以下是adc_c.c文件内容:
#include "adc.h"
#include "sys.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////  
//修改日期:2012/9/14 
//公司:
//编者:fanghui
//////////////////////////////////////////////////////////////////////////////////    
// fields in configuration register
//#define MCP342X_GAIN_X1    0X00 // GA gain X1
//#define MCP342X_GAIN_X2    0X01 // GA gain X2
//#define MCP342X_GAIN_X4    0X02 // GA gain X4
//#define MCP342X_GAIN_X8    0X03 // GA gain X8
//#define MCP342X_12_BIT     0X00 // 12-bit  240 SPS    5ms
//#define MCP342X_14_BIT     0X04 // 14-bit   60 SPS   17ms
//#define MCP342X_16_BIT     0X08 // 16-bit   15 SPS   67ms
//#define MCP342X_18_BIT     0X0C // 18-bit 3.75 SPS  267ms
//#define MCP342X_CONTINUOUS 0X10 // 1 = continuous, 0 = one-shot
//#define MCP342X_CHANNEL_1  0X00 // select MUX channel 1
//#define MCP342X_CHANNEL_2  0X20 // select MUX channel 2
//#define MCP342X_CHANNEL_3  0X40 // select MUX channel 3
//#define MCP342X_CHANNEL_4  0X60 // select MUX channel 4
//#define MCP342X_START      0X80 // write: start a conversion
//#define MCP342X_BUSY       0X80 // read: output not ready

//初始化IIC
void IIC_MCP3424_Init(void)
{      
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

IIC_MCP3424_SCL=1;
IIC_MCP3424_SDA=1;

IIC_MCP3424_AD1=0;//=1;
IIC_MCP3424_AD0=0;//=1;
}
//产生IIC起始信号
void IIC_MCP3424_Start(void)
{
IIC_MCP3424_SDA_OUT();
IIC_MCP3424_SDA=1;      
IIC_MCP3424_SCL=1;
delay_us(4);
  IIC_MCP3424_SDA=0;//START:when CLK is high,DATA change form high to low 
delay_us(4);
IIC_MCP3424_SCL=0;//钳住I2C总线,准备发送或接收数据 
}   
//产生IIC停止信号
void IIC_MCP3424_Stop(void)
{
IIC_MCP3424_SDA_OUT();//sda线输出
IIC_MCP3424_SCL=0;
IIC_MCP3424_SDA=0;//STOP:when CLK is high DATA change form low to high
  delay_us(4);
IIC_MCP3424_SCL=1; 
IIC_MCP3424_SDA=1;//发送I2C总线结束信号
delay_us(4);    
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_MCP3424_Wait_Ack(void)
{
u8 ucErrTime=0;
IIC_MCP3424_SDA_IN();//SDA设置为输入  
IIC_MCP3424_SDA=1;delay_us(1);    
IIC_MCP3424_SCL=1;delay_us(1);  
while(IIC_MCP3424_READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_MCP3424_Stop();
return 1;
}
}
IIC_MCP3424_SCL=0;//时钟输出0     
return 0;  

//产生ACK应答
void IIC_MCP3424_Ack(void)
{
IIC_MCP3424_SCL=0;
IIC_MCP3424_SDA_OUT();
IIC_MCP3424_SDA=0;
delay_us(2);
IIC_MCP3424_SCL=1;
delay_us(2);
IIC_MCP3424_SCL=0;
}
//不产生ACK应答     
void IIC_MCP3424_NAck(void)
{
IIC_MCP3424_SCL=0;
IIC_MCP3424_SDA_OUT();
IIC_MCP3424_SDA=1;
delay_us(2);
IIC_MCP3424_SCL=1;
delay_us(2);
IIC_MCP3424_SCL=0;
}        
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答   
void IIC_MCP3424_Send_Byte(u8 txd)
{                        
    u8 t;   
IIC_MCP3424_SDA_OUT();      
    IIC_MCP3424_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        IIC_MCP3424_SDA=(txd&0x80)>>7;
        txd<<=1;    
delay_us(2);//对TEA5767这三个延时都是必须的
IIC_MCP3424_SCL=1;
delay_us(2); 
IIC_MCP3424_SCL=0;
delay_us(2);//(2);
    }  
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_MCP3424_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
IIC_MCP3424_SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
{
        IIC_MCP3424_SCL=0; 
        delay_us(2);
IIC_MCP3424_SCL=1;
        receive<<=1;
        if(IIC_MCP3424_READ_SDA)receive++;   
delay_us(1);
    }  
    if (!ack)
        IIC_MCP3424_NAck();//发送nACK
    else
        IIC_MCP3424_Ack(); //发送ACK   
    return receive;
}
void IIC_MCP3424_CHANGE_CHL(u8 channel)//14bit
{
switch (channel)
{
case 1:
IIC_MCP3424_Start();
IIC_MCP3424_Send_Byte(0xd0);//write 1101 0000
IIC_MCP3424_Wait_Ack();
IIC_MCP3424_Send_Byte(0x94);
IIC_MCP3424_Wait_Ack();
//1101 0000 1000 1000
IIC_MCP3424_Stop();
break;
case 2:
IIC_MCP3424_Start();
IIC_MCP3424_Send_Byte(0xd0);
IIC_MCP3424_Wait_Ack();
IIC_MCP3424_Send_Byte(0xB4);//A8
IIC_MCP3424_Wait_Ack();
//1101 0000 1010 1000
IIC_MCP3424_Stop();
break;
case 3:
IIC_MCP3424_Start();
IIC_MCP3424_Send_Byte(0xd0);
IIC_MCP3424_Wait_Ack();
IIC_MCP3424_Send_Byte(0xD4);//C8
IIC_MCP3424_Wait_Ack();
//1101 0000 1100 1000
IIC_MCP3424_Stop();
break;
case 4:
IIC_MCP3424_Start();
IIC_MCP3424_Send_Byte(0xd0);
IIC_MCP3424_Wait_Ack();
IIC_MCP3424_Send_Byte(0xF4);//E4
IIC_MCP3424_Wait_Ack();
//1101 0000 1110 1000
IIC_MCP3424_Stop();
break;
default:
break;
}
}
u16 IIC_MCP3424_READ(u8 channel)//
{
u8 ADC_H=0;
u8 ADC_L=0;
//u8 ADC_config=0;
//u8 i=0;
//u8 ADC_flag=0;
//u16 rtn;
static  u16 rtn_1;
static  u16 rtn_2;
static  u16 rtn_3;
static  u16 rtn_4;
switch (channel)
{
case 1:
IIC_MCP3424_Start();
IIC_MCP3424_Send_Byte(0xd1);
IIC_MCP3424_Wait_Ack();
ADC_H=IIC_MCP3424_Read_Byte(1);// ack
IIC_MCP3424_Wait_Ack();
ADC_L=IIC_MCP3424_Read_Byte(0);// ack
//IIC_MCP3424_Wait_Ack();
//ADC_config=IIC_MCP3424_Read_Byte(0);//Nack
IIC_MCP3424_Stop();
rtn_1=(u16)ADC_H<<8;
rtn_1 += ADC_L;
return rtn_1;
//break;
case 2:
IIC_MCP3424_Start();
IIC_MCP3424_Send_Byte(0xd1);
IIC_MCP3424_Wait_Ack();
ADC_H=IIC_MCP3424_Read_Byte(1);// ack
IIC_MCP3424_Wait_Ack();
ADC_L=IIC_MCP3424_Read_Byte(0);// ack
//IIC_MCP3424_Wait_Ack();
//ADC_config=IIC_MCP3424_Read_Byte(0);
IIC_MCP3424_Stop();
rtn_2=(u16)ADC_H<<8;
rtn_2 += ADC_L;
return rtn_2;
//break;
case 3:
IIC_MCP3424_Start();
IIC_MCP3424_Send_Byte(0xd1);
IIC_MCP3424_Wait_Ack();
ADC_H=IIC_MCP3424_Read_Byte(1);// ack
IIC_MCP3424_Wait_Ack();
ADC_L=IIC_MCP3424_Read_Byte(0);// ack
//IIC_MCP3424_Wait_Ack();
//ADC_config=IIC_MCP3424_Read_Byte(0);
IIC_MCP3424_Stop();
rtn_3=(u16)ADC_H<<8;
rtn_3 += ADC_L;
return rtn_3;
//break;
case 4:
IIC_MCP3424_Start();
IIC_MCP3424_Send_Byte(0xd1);
IIC_MCP3424_Wait_Ack();
ADC_H=IIC_MCP3424_Read_Byte(1);// ack
IIC_MCP3424_Wait_Ack();
ADC_L=IIC_MCP3424_Read_Byte(0);// ack
//IIC_MCP3424_Wait_Ack();
//ADC_config=IIC_MCP3424_Read_Byte(0);
IIC_MCP3424_Stop();
rtn_4=(u16)ADC_H<<8;
rtn_4 += ADC_L;
return rtn_4;
//break;
default:
break;
}
//rtn=(u16)ADC_H<<8;
//rtn += ADC_L;
return 0;
}
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2013-6-21 23:27:09 | 显示全部楼层
以下是adc_h.h内容:
#ifndef __ADC_H
#define __ADC_H
#include "sys.h"
//MCP3424

//IO方向设置
#define IIC_MCP3424_SDA_IN()  {GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|=8<<24;} //1000 F F F
#define IIC_MCP3424_SDA_OUT() {GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|=3<<24;} //0011 F F F

//IO操作函数  

#define IIC_MCP3424_SCL        Cout(7) //SCL
#define IIC_MCP3424_SDA        Cout(6) //SDA  
#define IIC_MCP3424_READ_SDA   Cin(6)  //输入SDA 

#define IIC_MCP3424_AD0    Cout(8) //0 1
#define IIC_MCP3424_AD1    Cout(9) //0 1  


//IIC所有操作函数
void IIC_MCP3424_Init(void);                //初始化IIC的IO口  
void IIC_MCP3424_Start(void); //发送IIC开始信号
void IIC_MCP3424_Stop(void);    //发送IIC停止信号
void IIC_MCP3424_Send_Byte(u8 txd); //IIC发送一个字节
u8 IIC_MCP3424_Read_Byte(unsigned char ack);
u8 IIC_MCP3424_Wait_Ack(void);  //IIC等待ACK信号
void IIC_MCP3424_Ack(void); //IIC发送ACK信号
void IIC_MCP3424_NAck(void); //IIC不发送ACK信号

void IIC_MCP3424_CHANGE_CHL(u8 channel);
u16 IIC_MCP3424_READ(u8 channel);//,u8 step);

#endif
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2013-6-22 14:29:14 | 显示全部楼层
回复【11楼】dagong184:
---------------------------------
对于这个情况先用kill.dat批处理干掉中间的临时文件,再次编译看好了没有。
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 14:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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