📄 iic.c
字号:
#include "Main.h"
/******************************************************************
* *
* SETUP IIC PRESCALER VALUE FROM SERIAL CLOCK FREQUENCY *
* *
******************************************************************/
int SetPreScaler(int sclk)
{
return((int)(((MCLK_MHz/sclk)-3.0)/16.0)-0.5); //add 0.5 for
}
void IIC_Init(void)
{
IICCON = IICRESET; // reset IIC
IICPS = SetPreScaler(IIC_fCLK); // set IIC speed 50K
}
int DrvEepromWrite(int addr, int size, int * pdata)
{
int PageBuf[PAGE_SIZE];
int page,no_of_page;
int error = 0;
int i;
int remain_byte;
no_of_page = size / PAGE_SIZE;
remain_byte = size % PAGE_SIZE;
if(no_of_page)
{
for(page=0;page<no_of_page;page++)
{
for(i=0;i<PAGE_SIZE;i++)
{
PageBuf[i] = *pdata++;
}
DrvIicWriter(addr, PAGE_SIZE, PageBuf);
addr+=PAGE_SIZE;
}
}
if(remain_byte)
{
for(i=0;i<remain_byte;i++)
{
PageBuf[i] = *pdata++;
}
DrvIicWriter(addr, remain_byte, PageBuf);
}
return error;
}
int DrvIicRead(int addr, int size, int *pdata)
{
int i;
IIC_Init();
while(IICCON&BUSY); // waitting for not busy
IICCON = START|ACK; // send Start : start|ack
IICBUF = IIC_DEV_0|S_WRITE; // send control byte (write cmd):read block 0
while(!(IICCON&BF));
IICBUF = (int)(addr&0xFF); // send lsb address
while(!(IICCON&BF));
IICCON = RESTART;
IICCON = START|ACK;
IICBUF = IIC_DEV_0|S_READ;
while(!(IICCON&BF));
IICCON = ACK;
while(!(IICCON&BF));
for(i=0;i<size;i++)
{
*pdata++=IICBUF;
while(!(IICCON&BF));
}
IICCON = NOACK;
while(!(IICCON&BF));
IICCON = STOP;
return 0;
}
int DrvIicWriter(int address, int size, int *pdata)
{
int i;
IIC_Init();
while(IICCON&BUSY); // waitting for not busy
IICCON = START|ACK; // send Start : start|ack
IICBUF = IIC_DEV_0|S_WRITE; // send control byte (write cmd):read block 0
while(!(IICCON&BF));
IICBUF = (int)(address&0xFF); // send lsb address
while(!(IICCON&BF));
for(i=0;i<size;i++)
{
IICBUF=*pdata++;
while(!(IICCON&BF));
}
IICCON = STOP;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -