今天经过测试,前面那份程序终于调通了一个字节的读写。
连续读取还没整明白。
上程序:
#define CapDacvalue 4.97
#define SCL 21
#define SDA 20
byte SCLState = LOW;
byte IIC_Flag=0;
byte interval = 1;
int previousMillis = 0;
void IIC_Init(void)
{
/*
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
*/
digitalWrite(SCL,1);//IIC_SCL=1;
digitalWrite(SDA,1);//IIC_SDA=1;
}
void IIC_Start(void)
{
pinMode(SDA, OUTPUT);
digitalWrite(SDA,1);//IIC_SDA=1;
digitalWrite(SCL,1);//IIC_SCL=1;
delayMicroseconds(40);//uS
digitalWrite(SDA,0);//IIC_SDA=0;
delayMicroseconds(40);
digitalWrite(SCL,0);//IIC_SCL=0;
}
void IIC_Stop(void)
{
pinMode(SDA, OUTPUT);
digitalWrite(SCL,0);//IIC_SCL=0;
digitalWrite(SDA,0);//IIC_SDA=0;
delayMicroseconds(40);//uS
digitalWrite(SCL,1);
digitalWrite(SDA,1);
delayMicroseconds(40);//uS
}
byte IIC_Wait_Ack(void)
{
byte ucErrTime=0;
pinMode(SDA, OUTPUT);
digitalWrite(SDA,1);
delayMicroseconds(10);//uS
digitalWrite(SCL,1);
delayMicroseconds(10);//uS
pinMode(SDA, INPUT);
digitalWrite(SDA,1);
while(digitalRead(SDA))
{
ucErrTime++;
delayMicroseconds(10);//uS
if(ucErrTime>250)
{
IIC_Stop();
//Serial.println("No ACK");
return 1;
}
}
digitalWrite(SCL,0);//IIC_SCL=0;
return 0;
}
void IIC_Ack(void)
{
digitalWrite(SCL,0);//IIC_SCL=0;
pinMode(SDA, OUTPUT);//SDA_OUT();
digitalWrite(SDA,0);//IIC_SDA=0;
delayMicroseconds(20);//uS
digitalWrite(SCL,1);
delayMicroseconds(20);//uS
digitalWrite(SCL,0);
}
void IIC_NAck(void)
{
digitalWrite(SCL,0);//IIC_SCL=0;
pinMode(SDA, OUTPUT);//SDA_OUT();
digitalWrite(SDA,1);//IIC_SDA=1;
delayMicroseconds(20);//uS
digitalWrite(SCL,1);//IIC_SCL=1;
delayMicroseconds(20);//uS
digitalWrite(SCL,0);//IIC_SCL=0;
}
void IIC_Send_Byte(byte txd)
{
byte t;
pinMode(SDA, OUTPUT);//SDA_OUT();
digitalWrite(SCL,0);//IIC_SCL=0;
for(t=0;t<8;t++)
{
digitalWrite(SDA,(txd&0x80)>>7);//IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delayMicroseconds(20);//uS
digitalWrite(SCL,1);//IIC_SCL=1;
delayMicroseconds(20);//uS
digitalWrite(SCL,0);//IIC_SCL=0;
delayMicroseconds(20);//uS
}
}
unsigned char IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
pinMode(SDA, INPUT);
digitalWrite(SCL,0);//IIC_SCL=0;
digitalWrite(SDA,1);//IIC_SDA=1;
// Serial.println("IIC Reading Byte");
for(i=0;i<8;i++)
{
digitalWrite(SCL,0);//IIC_SCL=0
delayMicroseconds(20);//uS
digitalWrite(SCL,1);//IIC_SCL=1;
receive<<=1;
//Serial.println(receive,HEX);
if(digitalRead(SDA))
receive++;
delayMicroseconds(10);//delay_us(1);
}
if (!ack)
IIC_NAck();
else
IIC_Ack();
return(receive);
}
unsigned char IICWatask2(void) ///????,master wait for the ack,
{
unsigned char i=0;
unsigned char flag=0x01;
pinMode(SDA, OUTPUT);
digitalWrite(SCL,0);//IIC_SCL=0;
delayMicroseconds(20);//uS
digitalWrite(SDA,1);//IIC_SDA=1;
digitalWrite(SCL,1);//IIC_SCL=1;
delayMicroseconds(60);//delay_us(6);
pinMode(SDA, INPUT);
while(digitalRead(SDA)&&(i<250))///????while((IIC_SDA==1)&&(i<250)) could just use a delay?
{
i++;
delayMicroseconds(20);//uS
}
flag=digitalRead(SDA);//flag=IIC_SDA;
digitalWrite(SCL,0);//IIC_SCL=0;
return(flag);// 如果flag返回为0,主机没动过SDA电平,那只能是总线上有从机动了SDA意味着有反馈信号。
}
void IICSendask(void)
{
pinMode(SDA, OUTPUT);
digitalWrite(SDA,0);//IIC_SDA=0;
delayMicroseconds(30);//delay_us(3);
digitalWrite(SCL,1);//IIC_SCL=1;
delayMicroseconds(60);//delay_us(6);
delayMicroseconds(20);//delay_us(2);
digitalWrite(SCL,0);//IIC_SCL=0;
digitalWrite(SDA,1);//IIC_SDA=1;
delayMicroseconds(30);//delay_us(3);
}
unsigned char IICRECVbyte(void)
{
unsigned char i;
unsigned char temp=0;
pinMode(SDA, OUTPUT);
digitalWrite(SCL,0);//IIC_SCL=0;
digitalWrite(SDA,1);//IIC_SDA=1;
pinMode(SDA, INPUT);
for(i=0;i<8;i++)
{
digitalWrite(SCL,1);//IIC_SCL=1;
delayMicroseconds(50);//delay_us(5);
temp=temp<<1;
if(digitalRead(SDA)==1)//IIC_SDA==1
{
temp=temp|0x01;
Serial.println(temp);
}
else
{
temp=temp&0xfe;
Serial.println(temp);
}
digitalWrite(SCL,0);//IIC_SCL=0;
}
return(temp);
}
void AD7745_RESET(void)
{
IIC_Start();
IIC_Send_Byte(0xBF); // accroding to the reset method
IIC_Stop();
}
unsigned char SETUP_7745(unsigned char addr,unsigned char value)
{
unsigned char flag;
flag=0x01;
IIC_Start();
IIC_Send_Byte(0x90);
if(IIC_Wait_Ack()!=0)//(IICWatask2()!=0)
{
flag=1;
//Serial.print("NoAck");
return(flag);
}
else
{
flag=0;
//Serial.print("Acked");
}
IIC_Send_Byte(addr);
if(IIC_Wait_Ack()!=0)
{
flag=1;
//Serial.print("NoAck");
return(flag);
}
else
{
flag=0;
//Serial.print("Acked");
}
IIC_Send_Byte(value);
if(IIC_Wait_Ack()!=0)
{
flag=1;
//Serial.print("NoAck");
return(flag);
}
else
{
flag=0;
//Serial.print("Acked");
}
IIC_Stop();
return(flag);
}
void GET7745value(unsigned char *p,unsigned char addr,unsigned char n)// get a series of value
{
unsigned char i;
unsigned char flagw;
IIC_Start();
IIC_Send_Byte(0x90);
flagw=IIC_Wait_Ack();
if(flagw==1)return 0;
else Serial.print(flagw);
IIC_Send_Byte(addr); //从 Cap Data H开始读取0x01, addr 自定义开始读取的寄存器地址
flagw=IIC_Wait_Ack();
if(flagw==1)return 0;
else Serial.print(flagw);
IIC_Start();
IIC_Send_Byte(0x91);
flagw==IIC_Wait_Ack();
if(flagw==1)return 0;
else Serial.print(flagw);
for(i=0;i<n;i++)
{
*p=IIC_Read_Byte(1);//指针指向buffer
if(i!=n-1)
IICSendask();
else
IICSendask();
p++;
}
IIC_Stop();
}
// #define CapDacvalue 4.
// capdacreg=(int)((CapDacvalue*0x7F)/17
// capdacreg=0x80|capdacre
// AD7745_RESET(
// SETUP_7745(0x07,0x80
// SETUP_7745(0x09,0x2B
// SETUP_7745(0x0A,0xA1
// SETUP_7745(0x0B,capdacreg);
// GET7745value(MRD,3);
void setup() {
Serial.begin(9600);
// initialize digital pin as an output.
pinMode(SCL, OUTPUT);
AD7745_RESET();
delay(1000);
Serial.println("Reset");
SETUP_7745(0x07,0x80);
SETUP_7745(0x08,0x00);
SETUP_7745(0x09,0x2B);
SETUP_7745(0x0A,0xA2);
//int capdacreg=(int)((CapDacvalue*0x7F)/17);
//capdacreg=0x80|capdacreg;
//SETUP_7745(0x0B,capdacreg);
SETUP_7745(0x0B,0x7E);
SETUP_7745(0x0C,0x7F);
SETUP_7745(0x0D,0x80);
SETUP_7745(0x0E,0x00);
//SETUP_7745(0x0F,0x00);// factory calibrated capacitive gain calibration high byte
//SETUP_7745(0x10,0x00);// factory calibrated capacitive gain calibration low byte
//SETUP_7745(0x11,0x00);// factory calibrated votage gain calibration high byte
//SETUP_7745(0x12,0x00);// factory calibrated votage gain calibration low byte
Serial.println("Setup done");
}
// the loop function runs over and over again forever
void loop() {
byte n=1;//先取1个字节试试
byte buff[0];//*p指向的缓存区,准备1个字节的空间
for(byte j=0;j<n;j++)
{
buff[j]=0;//清洗缓存区,以免干扰
}
unsigned char addr;
addr=0x01;
//SETUP_7745(0x0B,0x11);
GET7745value(buff,addr,n);
for(byte j=0;j<n;j++)
{
Serial.print(addr,HEX);//从地址开始的位置为0
Serial.print(" ");
Serial.println(buff[j],HEX);
addr++;
}
delay(500000);
}
免打字版本:
电压给到5V才动起来的,之前给3.3V,总是不对