我自己写的如下,但是有问题。请大家做过的给指点指点。
[mw_shl_code=c,true]#ifndef __MCP3424_ADC_H
#define __MCP3424_ADC_H
#include "sys.h"
//MCP3424
// fields in configuration register
// RDY C1 C0 nO/C S1 S0 G1 G0
#define MCP342X_GAIN_X1 0X00 // PGA gain X1
#define MCP342X_GAIN_X2 0X01 // PGA gain X2
#define MCP342X_GAIN_X4 0X02 // PGA gain X4
#define MCP342X_GAIN_X8 0X03 // PGA 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
#define MCP342X_CHAL_1_CONFIG MCP342X_CHANNEL_1|MCP342X_GAIN_X1|MCP342X_16_BIT|MCP342X_CONTINUOUS
#define MCP342X_CHAL_2_CONFIG MCP342X_CHANNEL_2|MCP342X_GAIN_X1|MCP342X_16_BIT|MCP342X_CONTINUOUS
#define MCP342X_CHAL_3_CONFIG MCP342X_CHANNEL_3|MCP342X_GAIN_X1|MCP342X_16_BIT|MCP342X_CONTINUOUS
#define MCP342X_CHAL_4_CONFIG MCP342X_CHANNEL_4|MCP342X_GAIN_X1|MCP342X_16_BIT|MCP342X_CONTINUOUS
//IO方向设置
//#define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;} //1000 F F F
//#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;} //0011 F F F
#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
//#define IIC_MCP3424_AD0_P() {GPIOC->CRH&=0XFFFFFFF0;GPIOC->CRH|=3<<0;} //0011 F F F
//#define IIC_MCP3424_AD0_F() {GPIOC->CRH&=0XFFFFFFF0;GPIOC->CRH|=4<<0;} //0100 F F F
//#define IIC_MCP3424_AD1_P() {GPIOC->CRH&=0XFFFFFF0F;GPIOC->CRH|=3<<4;} //0011 F F F
//#define IIC_MCP3424_AD1_F() {GPIOC->CRH&=0XFFFFFF0F;GPIOC->CRH|=4<<4;} //0100 F F F
//IO操作函数
#define IIC_MCP3424_SCL PCout(7) //SCL
#define IIC_MCP3424_SDA PCout(6) //SDA
#define IIC_MCP3424_READ_SDA PCin(6) //输入SDA
#define IIC_MCP3424_AD0 PCout(8) //0 1
#define IIC_MCP3424_AD1 PCout(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);
#endif[/mw_shl_code]
[mw_shl_code=c,true]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(MCP342X_CHAL_1_CONFIG);//0x19);
IIC_MCP3424_Wait_Ack();
IIC_MCP3424_Stop();
break;
case 2:
IIC_MCP3424_Start();
IIC_MCP3424_Send_Byte(0xd0);
IIC_MCP3424_Wait_Ack();
IIC_MCP3424_Send_Byte(MCP342X_CHAL_2_CONFIG);//0x38)
IIC_MCP3424_Wait_Ack();
IIC_MCP3424_Stop();
break;
case 3:
IIC_MCP3424_Start();
IIC_MCP3424_Send_Byte(0xd0);
IIC_MCP3424_Wait_Ack();
IIC_MCP3424_Send_Byte(MCP342X_CHAL_3_CONFIG);//0x58);
IIC_MCP3424_Wait_Ack();
IIC_MCP3424_Stop();
break;
case 4:
IIC_MCP3424_Start();
IIC_MCP3424_Send_Byte(0xd0);
IIC_MCP3424_Wait_Ack();
IIC_MCP3424_Send_Byte(MCP342X_CHAL_4_CONFIG);//0x78);
IIC_MCP3424_Wait_Ack();
IIC_MCP3424_Stop();
break;
default:
break;
}
}
u16 IIC_MCP3424_READ(u8 channel)//
{
u16 ADC_H=0;
u16 ADC_L=0;
u8 ADC_config=0;
u8 i=0;
//u8 ADC_flag=0;
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(1);// ack
IIC_MCP3424_Wait_Ack();
ADC_config=IIC_MCP3424_Read_Byte(1);//ack
IIC_MCP3424_Wait_Ack();
do{
ADC_config=IIC_MCP3424_Read_Byte(1);//ack
IIC_MCP3424_Wait_Ack();
//ADC_flag = ADC_config & MCP342X_BUSY ? 0 : 1;
if((ADC_config & MCP342X_BUSY)==0x00){//if ADC_flag==1
ADC_config=IIC_MCP3424_Read_Byte(0);//Nack
IIC_MCP3424_Stop();
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(1);// ack
IIC_MCP3424_Wait_Ack();
ADC_config=IIC_MCP3424_Read_Byte(0);//Nack
IIC_MCP3424_Stop();
rtn_1=ADC_H*256+ADC_L;
return rtn_1;
}
i++;
}
while(i<20);
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(1);// ack
IIC_MCP3424_Wait_Ack();
//ADC_config=IIC_MCP3424_Read_Byte(1);//ack
//IIC_MCP3424_Wait_Ack();
do{
ADC_config=IIC_MCP3424_Read_Byte(1);//ack
IIC_MCP3424_Wait_Ack();
//ADC_flag = ADC_config & MCP342X_BUSY ? 0 : 1;
if((ADC_config & MCP342X_BUSY)==0x00){//if ADC_flag==1
ADC_config=IIC_MCP3424_Read_Byte(0);//Nack
IIC_MCP3424_Stop();
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(1);// ack
IIC_MCP3424_Wait_Ack();
ADC_config=IIC_MCP3424_Read_Byte(0);//Nack
IIC_MCP3424_Stop();
rtn_2=ADC_H*256+ADC_L;
return rtn_2;
}
i++;
}
while(i<10);
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(1);// ack
IIC_MCP3424_Wait_Ack();
//ADC_config=IIC_MCP3424_Read_Byte(1);//ack
//IIC_MCP3424_Wait_Ack();
do{
ADC_config=IIC_MCP3424_Read_Byte(1);//ack
IIC_MCP3424_Wait_Ack();
//ADC_flag = ADC_config & MCP342X_BUSY ? 0 : 1;
if((ADC_config & MCP342X_BUSY)==0x00){//if ADC_flag==1
ADC_config=IIC_MCP3424_Read_Byte(0);//Nack
IIC_MCP3424_Stop();
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(1);// ack
IIC_MCP3424_Wait_Ack();
ADC_config=IIC_MCP3424_Read_Byte(0);//Nack
IIC_MCP3424_Stop();
rtn_3=ADC_H*256+ADC_L;
return rtn_3;
}
i++;
}
while(i<10);
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(1);// ack
IIC_MCP3424_Wait_Ack();
//ADC_config=IIC_MCP3424_Read_Byte(1);//ack
//IIC_MCP3424_Wait_Ack();
do{
ADC_config=IIC_MCP3424_Read_Byte(1);//ack
IIC_MCP3424_Wait_Ack();
//ADC_flag = ADC_config & MCP342X_BUSY ? 0 : 1;
if((ADC_config & MCP342X_BUSY)==0x00){//if ADC_flag==1
ADC_config=IIC_MCP3424_Read_Byte(0);//Nack
IIC_MCP3424_Stop();
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(1);// ack
IIC_MCP3424_Wait_Ack();
ADC_config=IIC_MCP3424_Read_Byte(0);//Nack
IIC_MCP3424_Stop();
rtn_4=ADC_H*256+ADC_L;
return rtn_4;
}
i++;
}
while(i<10);
return rtn_4;
//break;
default:
break;
}
return 0;
}[/mw_shl_code]
这下面的是main里的主要代码:
[mw_shl_code=c,true]int main()
{
while(1)
{
/*timer*/
if(delay_time2 == 0){
delay_time2 = 1;//10ms*1=10ms
if(delay_ADC_10ms != 0)delay_ADC_10ms--;
}
switch (ADC_step)
{
case 1:
if(delay_ADC_10ms==0){
delay_ADC_10ms=CHANGE_TIME;
IIC_MCP3424_CHANGE_CHL(1);
ADC_step++;
}
break;
case 2:
if(delay_ADC_10ms==0){
ADC_step++;
}
break;
case 3:
ADC_ch_1_tmp =IIC_MCP3424_READ(1);
if(ADC_ch_1_tmp<32767)
{
ADC_ch_1=ADC_ch_1_tmp;
}
//else ADC_ch_1=0;
printf("AD=%05u\r\n",ADC_ch_1);
delay_ADC_10ms=3;
ADC_step=1;
break;
case 20:
ADC_step=1;
break;
default:
break;
}
}//end while(1)
}//end main()[/mw_shl_code]
|