📄 iic.c
字号:
/************iic dirver for c8051f020 ************************
system clock 8M
************************************************************/
#include "C8051F020.h"
#include "IIC.h"
void IIC_Config( ){
WDTCN = 0x07; // Watchdog Timer Control Register
WDTCN = 0xDE; // Disable WDT
WDTCN = 0xAD;
XBR0 = 0x07; // XBAR0: Initial Reset Value
XBR1 = 0x00; // XBAR1: Initial Reset Value
XBR2 = 0x40; // XBAR2: Initial Reset Value
P0MDOUT = 0x1D; // Output configuration for P0
OSCXCN = 0x00; // EXTERNAL Oscillator Control Register
OSCICN = 0x06; // Internal Oscillator Control Register
SMB0CN = 0x40; // SMBus Control Register
SMB0ADR = 0xA0; // SMBus Address Register
SMB0CR = 0x60; // SMBus Clock Rate Register
}
void Delay_IIC(){
unsigned char i=10;
while(i--);
}
void GetBus(){
SMB0CN=release_bus_sta;
while(SI==0);
}
void SendByte( unsigned char dataa ){
SMB0DAT=dataa;
SMB0CN=release_bus_ack;
while(SI==0);
} // waitting......
bit SmbRec(unsigned char slaadd ,unsigned char subadd ,unsigned char num ,unsigned char *RecPtr )
{ unsigned char counter;
Delay_IIC();
GetBus();
Delay_IIC();
SendByte ( slaadd );
Delay_IIC();
if( SMB0STA!=0X18){
STO=1;
return(0);
}
SendByte( subadd );
if(SMB0STA!=0X28){
STO=1;
return(0);
}
Delay_IIC();
SMB0CN=release_bus_sta;
while(SI==0);
Delay_IIC();
SendByte( slaadd+1 ) ; // send slaadd + r
Delay_IIC();
if(SMB0STA!=0X40){
SMB0CN=generate_stop;
return(0);
}
for(counter=0;counter<(num-1);counter++){
SMB0CN=release_bus_ack; // set ACK
while( SI==0);
if( SMB0STA!=0X50){
SMB0CN=generate_stop;
return(0);
}
*RecPtr=SMB0DAT;
RecPtr++;
}
SMB0CN=release_bus_nack; // set NACK
while(SI==0); // receive the last byte data
*RecPtr=SMB0DAT;
SMB0CN=generate_stop;
return(1);
}
bit SmbSend ( unsigned char slaadd , unsigned char subadd ,unsigned char num ,unsigned char *SendPtr){
unsigned char counter;
GetBus();
SendByte( slaadd );
if(SMB0STA!=0X18){
STO=1;
return(0);
}
SendByte( subadd ); // send subaddress
if( SMB0STA!=0X28){
STO=1;
return(0);
}
for(counter=0;counter<num; counter++){
SendByte ( *SendPtr );
if( SMB0STA!=0X28 ){
STO=1;
return(0);
}
SendPtr++;
}
SMB0CN=generate_stop; // stop the bus
return(1);
} // end SmbSend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -