天天看點

IIC的多位元組讀取

前言

前面有做過用MSP430的IIC軟體實作,現在換了一塊闆子而且一次需要讀寫闆子上連續的三個寄存器,以前看的資料都是讀寫單個位元組,這一下可把爺給整懵逼了…是以學完以後特地來記錄一下,代碼是AD7745官網上給的代碼,就複制儲存下來了。

MSP430G2553軟體實作IIC

IIC協定詳解

首先我用的晶片是AD7745高精度電容測量晶片,其電容值存儲在三個連續的寄存器内,分别存高位,中位和低位,是以一次讀取需要讀取到多個位元組但是友好的是,這塊晶片在實作多位元組讀取的時候可以利用内部的位址指針,也就是不需要管要寫入的寄存器位址,它會自增,我們隻需要不斷改變需要寫入的資料即可(不過我覺得應該所有晶片都支援這種操作)

多位元組讀寫時序

其實看了一下資料,也不難

IIC的多位元組讀取

說白了也就是在第一次讀取資料後不着急發送NACK和STOP信号,同理寫信好也一樣,在寫入一次資料以後不着急發送STOP信号,而是選擇接受從機ACK,在全部寫完以後再發送。

代碼

寫函數

void IIC_Write(uint8_t slaveAddress,
               uint8_t* dataBuffer,
               uint8_t bytesNumber,//需要寫入的資料個數
                        uint8_t stopBit)
{
  uint8_t count =bytesNumber;
  IIC_Start();
  IIC_SendByte(slaveAddress<<1);
  while(count--)
  {
     IIC_SendByte(*(dataBuffer++)); 
  }         	//重點就是這個循環了
  if(stopBit == 1)	//循環結束後再發送停止信号
  {  
      IIC_Stop();
  }   
 
}
           

讀函數

void IIC_Read(uint8_t slaveAddress,
                       uint8_t* dataBuffer,
                       uint8_t bytesNumber,
                       uint8_t stopBit)
{
 uint8_t count =bytesNumber;
 
 IIC_Start();
 IIC_SendByte((slaveAddress<<1)+1);
 
  while(count--)
  {
     *(dataBuffer++)=IIC_ReceiveByte();
    count==0 ? IIC_NoAck(): IIC_Ack();   	//主機每次讀取完畢後都傳回一次ACK應答信号
  }         
  if(stopBit == 1)
  {  
      IIC_Stop();				//退出循環後才發送停止信号
  } 
}
           

繼續閱讀