#include <msp430.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define CPU_F ((double)1500000)
#define delayus(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delayms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define OP_READ 0x91 //器件地址读
#define OP_WRITE 0x90 //器件地址写
#define uchar unsigned char
#define uint unsigned int
#define SDA_OUT P1DIR |= BIT6
#define SDA_IN P1DIR &= ~BIT6
#define SCL_OUT P1DIR |= BIT7
#define SCL_IN P1DIR &= ~BIT7
#define SDA_H P1OUT |= BIT6
//#define SDA_H P1DIR &= ~BIT6
#define SDA_L P1OUT &= ~BIT6
//#define SDA_L P1DIR |= BIT6; P1OUT &= ~BIT6
#define SCL_H P1OUT |= BIT7
#define SCL_L P1OUT &= ~BIT7
//*********************************
//定义常量
//*********************************
#define FULL_SCALE 0xFFFFFF
#define SEMI_SCALE 0x800000
//#define SEMI_SCALE 0x000000
#define CAPDAC_UNIT 0.133858 // 17pF/(2^7-1) CAPDACA 7位有效
#define DataNumber 8 // 电容数据平均
//*********************************
//定义变量
//*********************************
unsigned char in_buff[3]; // the data buffer
unsigned char out_buff[6] = {0x80,0x00,0x0B,0x39}; // config the data buffer
unsigned char offset_buf[2] = {0x8A,0xD0};
long int CDC_Register_data; // CDC寄存器数据
float CAPDAC; // 偏移的电容值
float CDC_Capacitance,CDC_Capacitance1,CDC_Capacitance2; // 测量电容值
int cap_convert_over = 0;
unsigned char Capdac_Parameter = 30;
unsigned char capdac_buf[5] = {0x80,0x00,0x0B,0x39}; //原配置{0x80,0x00,0x08,0x39};
unsigned char capdac_offset;
long capdac_register_data;
unsigned char Int_dec = 0;
unsigned char i = 0;
float Accumulator = 0;
float Impedance_temp;
float Capacitance;
float Max=0;
float Min=0;
unsigned char MaxFlag,MinFlag,Exchange;
float DataArr[DataNumber]; // 电容数据存储
int InitFlag=0;
unsigned char ucLen =0;
char Data[25]={0};
unsigned char k=0;
void write_byte(uint data);
/**************************** Initialize System Clock ************************/
//Configuration: F_DCO = 24MHz, F_MCLK = 24MHz, F_SMCLK = 6MHz, F_ACLK = 750kHz
void InitCLK(void)
{
//password for CS
CSCTL0 = CSKEY;
// Set max. DCO setting. Set DC0 =24MHz
CSCTL1 |= DCORSEL + DCOFSEL0 + DCOFSEL1;
// set ACLK = MCLK = DCO
CSCTL2 = SELA_3 + SELS_3 + SELM_3;
// set dividers: MCLK: 1, SMCLK: 4, ACLK: 32
CSCTL3 = DIVA__32 + DIVS__4 + DIVM_4;
}
void start()
{
SCL_OUT;
SDA_OUT;
SDA_H;
delayms(1);
SCL_H;
delayms(1);
SDA_L;
delayms(1);
SCL_L;
delayms(1);
}
void stop()
{
SDA_OUT;
SCL_OUT;
SDA_L;
delayms(1);
SCL_H;
delayms(1);
SDA_H;
delayms(1);
}
void Ack()
{
SDA_OUT;
SCL_OUT;
SCL_L;
SDA_L;
delayms(1);
SCL_H;
delayms(1);
SCL_L;
}
void NAck()
{
SDA_OUT;
SCL_OUT;
SCL_L;
SDA_H;
delayus(2);
SCL_H;
delayus(2);
SCL_L;
}
unsigned int WAck()
{
SDA_H;
SDA_IN;
SCL_H;
while(P1IN & BIT6)
{
}
SCL_L;
delayms(1);
return 0;
}
//mcu读取数据
uchar read_byte()
{
uchar i,read_data;
SDA_OUT;
SCL_L;
SDA_H;
for(i = 0;i<8;i++)
{
SDA_H;
delayus(2);
SCL_H;
SDA_IN;
delayus(2);
read_data <<= 1;
if(P1IN & BIT6)
read_data |= 0x01;
SDA_OUT;
SCL_L;
}
delayms(5);
return(read_data);
}
void write_byte(uint data)
{
uchar i;
SCL_OUT;
SDA_OUT;
for(i = 0;i<8;i++)
{
if(data & 0x80)
SDA_H;
else
SDA_L;
delayms(1);
SCL_H;
delayms(1);
SCL_L;
delayms(1);
data = data << 1;
}
// SCL_L;
// delayus(2);
delayms(5);
}
//向指定地址写数据
void write_dat(uchar addr,uchar write_data)
{
start();
write_byte(OP_WRITE);
WAck();
write_byte(addr);
WAck();
write_byte(write_data);
WAck();
stop();
delayus(1000);
}
//从指定地址读数据
uchar read_random(uint random_addr)
{
uchar i;
start();
write_byte(OP_WRITE);
WAck();
write_byte(random_addr);
WAck();
start();
write_byte(OP_READ);
WAck();
i = read_byte();
stop();
return i;
}
void Init_AD7745()
{
start();
write_byte(0X09);
WAck();
write_byte(0xBF);
delayus(500);
WAck();
stop();
}
void EEPROM_WriteArray (unsigned char dest_addr, unsigned char* src_addr,
unsigned char len)
{
unsigned char i;
start();
write_byte(OP_WRITE);
WAck();
write_byte(dest_addr);
WAck();
for( i = 0; i < len; i++ )
{
write_byte(src_addr[i]);
WAck();
}
stop();
delayus(1000);
}
void EEPROM_ReadArray (unsigned char* dest_addr, unsigned char src_addr,
unsigned char len)
{
uchar i;
start();
write_byte(OP_WRITE);
WAck();
write_byte(src_addr);
WAck();
start();
write_byte(OP_READ);
WAck();
for( i = 0; i < len; i++ )
{
dest_addr[i] = read_byte();
if(i!=len-1)
Ack();
else
NAck();
}
stop();
}
void Capdacsetup(void)
{
EEPROM_WriteArray(0x0D, offset_buf, sizeof(offset_buf)); // OFFSET寄存器初始化
Capdac_Parameter = 127;
capdac_offset = Capdac_Parameter;
out_buff[4] = 0x80+capdac_offset; //CAPDACA is set to capdac_offset
out_buff[5] = 0x80; //CAPDACB is set to 0
CAPDAC = (float)(capdac_offset*CAPDAC_UNIT); //CAPDAC只会取4值,即4.25,8.5,12.75,17
EEPROM_WriteArray(0x07, out_buff, sizeof(out_buff)); // data collect
memset(DataArr,0,sizeof(float)*DataNumber);
}
void ReadData(void)
{
EEPROM_ReadArray(in_buff, 0x01, sizeof(in_buff)); // read the data register
CDC_Register_data = 0;
CDC_Register_data = in_buff[0];
CDC_Register_data <<= 8;
CDC_Register_data += in_buff[1];
CDC_Register_data <<= 8;
CDC_Register_data += in_buff[2];
CDC_Register_data &= 0x00ffffff;
CDC_Capacitance2 = (float)(FULL_SCALE-SEMI_SCALE);
if(CDC_Register_data>= SEMI_SCALE)
{
CDC_Capacitance1 = (float)(CDC_Register_data-SEMI_SCALE);
CDC_Capacitance = 4.096 * (CDC_Capacitance1/CDC_Capacitance2);
}
else
{
CDC_Capacitance1 = (float)(SEMI_SCALE-CDC_Register_data);
CDC_Capacitance = -4.096 * (CDC_Capacitance1/CDC_Capacitance2);
}
CDC_Capacitance = CAPDAC+CDC_Capacitance;
DataArr[Int_dec++]=CDC_Capacitance;
if(Int_dec==DataNumber)
Int_dec=0;
///////////////////////////////////////////////////////////
for(i=0;i<DataNumber;i++) // DataNumber个数据求和
{
Accumulator +=DataArr[i];
}
Capacitance = Accumulator/DataNumber;
Accumulator = 0;
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
uchar data;
InitCLK();
;
while(1)
{
data = read_random(0x00);
data = data + 1;
}
}
基于MSP430的AD7745的模拟IIC驱动
需积分: 5 140 浏览量
2019-03-20
15:41:42
上传
评论
收藏 263KB RAR 举报
爱吃骨头的猫、
- 粉丝: 6536
- 资源: 13
最新资源
- C语言基础-C语言编程基础之Leetcode编程题解之第39题组合总和.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第38题外观数列.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第37题解数独.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第36题有效的数独.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第35题搜索插入位置.zip
- index.wxml
- C语言基础-C语言编程基础之Leetcode编程题解之第33题搜索旋转排序数组.zip
- 基于Python实现的手写数字识别系统源码.zip
- 从网页提取禁止转载的文字
- C语言基础-C语言编程基础之Leetcode编程题解之第32题最长有效括号.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈