📄 iic.c
字号:
/*********************************************************************************************
* File: iic.c
* Author: embest
* Desc: iic source code
* History:
*********************************************************************************************/
#include "44b.h"
#include "44blib.h"
#include "def.h"
#include "iic.h"
/*------------------------------------------------------------------------------------------*/
/* global variables */
/*------------------------------------------------------------------------------------------*/
int f_nGetACK;
/*------------------------------------------------------------------------------------------*/
/* function declare */
/*------------------------------------------------------------------------------------------*/
void iic_int(void);// __attribute__ ((interrupt ("IRQ")));
void iic_test(void);
void write_24c040(UINT32T unSlaveAddr, UINT32T unAddr, UINT8T ucData);
void read_24c040(UINT32T unSlaveAddr, UINT32T unAddr, UINT8T *pData);
/*********************************************************************************************
* name: iic_test
* func: test iic
* para: none
* ret: none
* modify:
* comment:
********************************************************************************************/
void iic_test(void)
{
UINT8T szData[16];
unsigned int i, j;
uart_printf("IIC Test using AT24C04...\n");
uart_printf("Write char 0-f into AT24C04\n");
f_nGetACK = 0;
// Enable interrupt
rINTMOD = 0x0;
rINTCON = 0x1;
rINTMSK &= ~(BIT_GLOBAL|BIT_IIC);
pISR_IIC = (unsigned)iic_int;
// Initialize iic
rIICADD = 0x10; // S3C44B0X slave address
rIICCON = 0xaf; // Enable ACK, interrupt, IICCLK=MCLK/16, Enable ACK//64Mhz/16/(15+1) = 257Khz
rIICSTAT = 0x10; // Enable TX/RX
// Write 0 - 16 to 24C04
for(i=0; i<16; i++)
write_24c040(0xa0, i, i);
// Clear array
for(i=0; i<16; i++)
szData[i]=0;
// Read 16 byte from 24C04
for(i=0; i<16; i++)
read_24c040(0xa0, i, &(szData[i]));
// Printf read data
uart_printf("Read 16 bytes from AT24C04\n");
for(i=0; i<16; i++)
{
uart_printf("%2x ", szData[i]);
}
uart_printf("\n");
}
/*********************************************************************************************
* name: write_24c040
* func: write data to 24C040
* para: unSlaveAddr --- input, chip slave address
* unAddr --- input, data address
* ucData --- input, data value
* ret: none
* modify:
* comment:
********************************************************************************************/
void write_24c040(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T ucData)
{
f_nGetACK = 0;
/* Send control byte */
rIICDS = unSlaveAddr; // 0xa0
rIICSTAT = 0xf0; // Master Tx,Start
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
/* Send address */
rIICDS = unAddr;
rIICCON = 0xaf; // Resumes IIC operation.
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
/* Send data */
rIICDS = ucData;
rIICCON = 0xaf; // Resumes IIC operation.
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
/* End send */
rIICSTAT = 0xd0; // Stop Master Tx condition
rIICCON = 0xaf; // Resumes IIC operation.
delay(5); // Wait until stop condtion is in effect.
}
/*********************************************************************************************
* name: read_24c040
* func: read data from 24C040
* para: unSlaveAddr --- input, chip slave address
* unAddr --- input, data address
* pData --- output, data pointer
* ret: none
* modify:
* comment:
********************************************************************************************/
void read_24c040(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T *pData)
{
char cRecvByte;
f_nGetACK = 0;
/* Send control byte */
rIICDS = unSlaveAddr; // 0xa0
rIICSTAT = 0xf0; // Master Tx,Start
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
/* Send address */
rIICDS = unAddr;
rIICCON = 0xaf; // Resumes IIC operation.
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
/* Send control byte */
rIICDS = unSlaveAddr; // 0xa0
rIICSTAT = 0xb0; // Master Rx,Start
rIICCON = 0xaf; // Resumes IIC operation.
while(f_nGetACK == 0); // Wait ACK
f_nGetACK = 0;
/* Get data */
cRecvByte = rIICDS;
rIICCON = 0x2f;
delay(1);
/* Get data */
cRecvByte = rIICDS;
/* End receive */
rIICSTAT = 0x90; // Stop Master Rx condition
rIICCON = 0xaf; // Resumes IIC operation.
delay(5); // Wait until stop condtion is in effect.
*pData = cRecvByte;
}
/*********************************************************************************************
* name: iic_int
* func: IIC interrupt handler
* para: none
* ret: none
* modify:
* comment:
********************************************************************************************/
void iic_int(void)
{
rI_ISPC=BIT_IIC;
f_nGetACK = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -