新版本公告
~~空空如也
加载中
加载中
表情图片
评为精选
鼓励
加载中...
分享
加载中...
文件下载
加载中...

今天经过测试,前面那份程序终于调通了一个字节的读写。

连续读取还没整明白。

上程序:

#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);

}

免打字版本:

attachment icon IIC-try3.ino 8.93KB INO 49次下载

18.png

电压给到5V才动起来的,之前给3.3V,总是不对


文号 / 867991

十步芳草
名片发私信
学术分 0
总主题 7 帖总回复 179 楼拥有证书:进士 机友 笔友
注册于 2019-11-04 16:53最后登录 2025-04-24 14:02
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:浙江

个人简介

自制YBCO中

文件下载
加载中...
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
等待中...
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
处理中..
处理失败
插入表情
我的表情
共享表情
Emoji
上传
注意事项
最大尺寸100px,超过会被压缩。为保证效果,建议上传前自行处理。
建议上传自己DIY的表情,严禁上传侵权内容。
点击重试等待上传{{s.progress}}%处理中...已上传,正在处理中
空空如也~
处理中...
处理失败
加载中...
草稿箱
加载中...
此处只插入正文,如果要使用草稿中的其余内容,请点击继续创作。
{{fromNow(d.toc)}}
{{getDraftInfo(d)}}
标题:{{d.t}}
内容:{{d.c}}
继续创作
删除插入插入
插入公式
评论控制
加载中...
文号:{{pid}}
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的