i2c.c
来自「CS8955控制TV软件。用MCU做模拟电视的控制。」· C语言 代码 · 共 446 行
C
446 行
/******************************************************************************\
Project Version: MTKCARDVD()
********************************************************************************
Filename: I2c.c
Author: Alan Chan
Company: CoreTek/ACT Company
********************************************************************************
File Version: 1.01
File Created: July 2007
Compiled Using: keil uVision2 Version 2.23
********************************************************************************
Files Required:
********************************************************************************
File Description:
********************************************************************************
File History:
--------------------------------------------------------------------------------
Date Name Description
--------------------------------------------------------------------------------
Mar. 2007 Alan Chan File Created
\******************************************************************************/
#include "global.h"
/****************************************************************************/
void Delay1us(WORD Time) // delay
{
for (;Time>0;Time--)
{
_nop_();_nop_();
}
}
void Delay1ms(WORD Time) // delay 1ms
{
BYTE Counter;
for(; Time > 0; Time --)
{
Counter = 250;
while(--Counter)
_nop_();
Counter = 250;
while(--Counter)
_nop_();
}
}
/****************************************************************************/
// Software IIC
/****************************************************************************/
//---------------------------------------------------------------------------
void IIC_Start(BIT ch)
{
if (!ch)
{
ResSDA1;
ResSCL1;
}
else
{
ResSDA2;
ResSCL2;
}
}
//---------------------------------------------------------------------------
void IIC_Stop(BIT ch)
{
if (!ch)
{
SetSDA1;
ResSDA1;
SetSCL1;
while(!GetSCL1);
SetSDA1;
}
else
{
SetSDA2;
ResSDA2;
SetSCL2;
while(!GetSCL2);
SetSDA2;
}
}
//---------------------------------------------------------------------------
void IIC_Send1Byte(BIT ch, BYTE senddata)
{
BYTE i;
if (!ch)
{
for(i = 0; i < 8; i++)
{
if(senddata & 0x80)
{
SetSDA1;
}
else
{
ResSDA1;
}
senddata <<=1;
SetSCL1;
while(!GetSCL1);
ResSCL1;
}
ResSCL1;
SetSDA1;
SetSCL1;
while(!GetSCL1);
if (GetSDA1)
{
bNoAck = 1;
}
else
bNoAck = 0;
ResSCL1;
}
else
{
for(i = 0; i < 8; i++)
{
if(senddata & 0x80)
{
SetSDA2;
}
else
{
ResSDA2;
}
senddata <<=1;
SetSCL2;
while(!GetSCL2);
ResSCL2;
}
ResSCL2;
SetSDA2;
SetSCL2;
while(!GetSCL2);
if (GetSDA2)
bNoAck = 1;
else
bNoAck = 0;
ResSCL2;
}
}
//---------------------------------------------------------------------------
BYTE IIC_Read1Byte(BIT ch, BIT noack)
{
BYTE i,readdata=0;
if (!ch)
{
for(i = 0; i < 8; i++)
{
readdata <<= 1;
SetSDA1;
SetSCL1;
while(!GetSCL1);
// Delay1us(1);
if(GetSDA1)
readdata |= 0x01;
ResSCL1;
}
if(noack)
{
SetSDA1;
}
else
{
ResSDA1;
}
SetSCL1;
// lun hahaha
while(!GetSCL1);
ResSCL1;
// lun hahaha
if(!noack)
{
SetSDA1;
}
}
else
{
for(i = 0; i < 8; i++)
{
readdata <<= 1;
SetSDA2;
SetSCL2;
while(!GetSCL2);
if(GetSDA2)
readdata |= 0x01;
ResSCL2;
}
if(noack)
{
SetSDA2;
}
else
{
ResSDA2;
}
SetSCL2;
while(!GetSCL2);
ResSCL2;
if(!noack)
{
SetSDA2;
}
}
return readdata;
}
// lun hahaha
//---------------------------------------------------------------------------
BYTE IIC_ReadByte(BIT ch, BIT noack)
{
BYTE i,readdata=0;
if (!ch)
{
for(i = 0; i < 8; i++)
{
readdata <<= 1;
SetSDA1;
SetSCL1;
while(!GetSCL1);
Delay1us(1);
if(GetSDA1)
readdata |= 0x01;
ResSCL1;
}
if(noack)
{
SetSDA1;
}
else
{
ResSDA1;
}
SetSCL1;
}
return readdata;
}
/****************************************************************************/
// IIC write address
/****************************************************************************/
void IICSW_Write(BIT ch, BYTE id,BOOL boolSubAddr,BYTE addr,BYTE *databuf,WORD number)
{
int i;
BYTE count = 0;
do
{
count++;
// Stop
IIC_Stop(ch);
Delay1us(20);
// Start
IIC_Start(ch);
// Slave ID
IIC_Send1Byte(ch,id);
if (bNoAck)
{
continue;
}
// Address
if(boolSubAddr)
{
IIC_Send1Byte(ch,addr);
if (bNoAck)
continue;
}
// data
for(i = 0; i < number; i++)
{
IIC_Send1Byte(ch,databuf[i]);
if (bNoAck)
break;
}
if (bNoAck)
continue;
// Stop
IIC_Stop(ch);
}
while(bNoAck && (count<10));
}
/****************************************************************************/
// IIC Read address
/****************************************************************************/
void IICSW_Read(BIT ch, BYTE id,BOOL boolSubAddr,BYTE addr,BYTE *databuf,WORD number)
{
int i;
BYTE count = 0;
do
{
count++;
// Stop
IIC_Stop(ch);
Delay1us(20);
// Start
if(boolSubAddr)
{
IIC_Start(ch);
// Slave ID
IIC_Send1Byte(ch,id);
if (bNoAck)
continue;
// Address
IIC_Send1Byte(ch,addr);
if (bNoAck)
continue;
if (!ch)
{
SetSDA1;
SetSCL1;
while(!GetSCL1);
}
else
{
SetSDA2;
SetSCL2;
while(!GetSCL2);
}
}
IIC_Start(ch);
// Slave ID
IIC_Send1Byte(ch, (id | 0x01));
if (bNoAck)
continue;
// data
if(boolSubAddr)
{
for(i = 0; i < number-1; i++)
{
databuf[i] = IIC_Read1Byte(ch,0);
}
databuf[i] = IIC_Read1Byte(ch,1);
}
else
databuf[0] = IIC_Read1Byte(ch,1);
// Stop
IIC_Stop(ch);
}
while(bNoAck && count < 10);
}
void IICSW_WriteTest(void) //test martin 28May08
{
/*
mSetDvdIr();
Delay1ms(100);
mClrDvdIr();
Delay1ms(100);
*/
SetSCL1;
SetSDA1;
mSetDvdIr();
// Delay1ms(100);
// Delay1ms(100);
// Delay1ms(20);
ResSDA1;
ResSCL1;
mClrDvdIr();
// Delay1ms(100);
// Delay1ms(100);
// Delay1ms(20);
SetSCL1;
SetSDA1;
mSetDvdIr();
// Delay1ms(100);
// Delay1ms(100);
// Delay1ms(20);
ResSDA1;
ResSCL1;
mClrDvdIr();
// Delay1ms(100);
// Delay1ms(100);
// Delay1ms(20);
SetSCL1;
SetSDA1;
mSetDvdIr();
// Delay1ms(100);
// Delay1ms(100);
// Delay1ms(20);
ResSDA1;
ResSCL1;
mClrDvdIr();
// Delay1ms(100);
// Delay1ms(100);
// Delay1ms(20);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?