前言
前面有做過用MSP430的IIC軟體實作,現在換了一塊闆子而且一次需要讀寫闆子上連續的三個寄存器,以前看的資料都是讀寫單個位元組,這一下可把爺給整懵逼了…是以學完以後特地來記錄一下,代碼是AD7745官網上給的代碼,就複制儲存下來了。
MSP430G2553軟體實作IIC
IIC協定詳解
首先我用的晶片是AD7745高精度電容測量晶片,其電容值存儲在三個連續的寄存器内,分别存高位,中位和低位,是以一次讀取需要讀取到多個位元組但是友好的是,這塊晶片在實作多位元組讀取的時候可以利用内部的位址指針,也就是不需要管要寫入的寄存器位址,它會自增,我們隻需要不斷改變需要寫入的資料即可(不過我覺得應該所有晶片都支援這種操作)
多位元組讀寫時序
其實看了一下資料,也不難
說白了也就是在第一次讀取資料後不着急發送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(); //退出循環後才發送停止信号
}
}