📄 smbus.c
字号:
/////////////////////////////////////
// /////////////begain//////////////
/////////////////////////////////////
#include "C8051F340.h"
#include <STDIO.H>
#include <INTRINS.H>
#define WRITE 0x00
#define READ 0x01
#define CHIP_ID 0xc4
#define SMB0STA SMB0CN&0xFC
#define SMB_START 0xE0
#define SMB_MTDATADD 0xC0
#define SMB_MRDAT 0x88
sbit TTQH6_RST0=P0^6;
bit BUSY;
bit flag=0;
bit rd_flag=0;
char command;
char t_word;
char r_word;
void T3_interrupt(void);
void SmBus_ISR(void);
void SM_Send(char chip_select,unsigned char byte_address,char out_byte);
char SM_Receive(char chip_select,unsigned char byte_address);
unsigned char register_add;
char count;
/////////////////////////////////////
// Generated Initialization File //
/////////////////////////////////////
#include "C8051F340.h"
// Peripheral specific initialization functions,
// Called from the Init_Device() function
void PCA_Init()
{
PCA0MD &= ~0x40;
PCA0MD = 0x00; //禁止看门狗
}
void Timer_Init()
{
TCON = 0x10;
TMOD = 0x02;
CKCON = 0x04;
TH0 = 0xEC; // 200kbps
}
void SMBus_Init()
{
SMB0CF = 0xD0; // SMBUS允许,从事件禁止,SCL低电平扩展
}
void Port_IO_Init()
{
// P0.0 - SDA (SMBus), Open-Drain, Digital
// P0.1 - SCL (SMBus), Open-Drain, Digital
// P0.2 - Unassigned, Open-Drain, Digital
// P0.3 - Unassigned, Open-Drain, Digital
// P0.4 - Unassigned, Open-Drain, Digital
// P0.5 - Unassigned, Open-Drain, Digital
// P0.6 - Unassigned, Open-Drain, Digital
// P0.7 - Unassigned, Open-Drain, Digital
// P1.0 - Unassigned, Open-Drain, Digital
// P1.1 - Unassigned, Open-Drain, Digital
// P1.2 - Unassigned, Open-Drain, Digital
// P1.3 - Unassigned, Open-Drain, Digital
// P1.4 - Unassigned, Open-Drain, Digital
// P1.5 - Unassigned, Open-Drain, Digital
// P1.6 - Unassigned, Open-Drain, Digital
// P1.7 - Unassigned, Open-Drain, Digital
// P2.0 - Unassigned, Open-Drain, Digital
// P2.1 - Unassigned, Open-Drain, Digital
// P2.2 - Unassigned, Open-Drain, Digital
// P2.3 - Unassigned, Open-Drain, Digital
// P2.4 - Unassigned, Open-Drain, Digital
// P2.5 - Unassigned, Open-Drain, Digital
// P2.6 - Unassigned, Open-Drain, Digital
// P2.7 - Unassigned, Open-Drain, Digital
// P3.0 - Unassigned, Open-Drain, Digital
// P3.1 - Unassigned, Open-Drain, Digital
// P3.2 - Unassigned, Open-Drain, Digital
// P3.3 - Unassigned, Open-Drain, Digital
// P3.4 - Unassigned, Open-Drain, Digital
// P3.5 - Unassigned, Open-Drain, Digital
// P3.6 - Unassigned, Open-Drain, Digital
// P3.7 - Unassigned, Open-Drain, Digital
XBR0 = 0x04;
XBR1 = 0x40; //SMBUS引脚使能,交叉开关允许
}
void Oscillator_Init()
{
OSCICN = 0x83; //12MHz系统时钟
}
void Interrupts_Init()
{
EIE1 = 0x01;
IE = 0x80; //全局中断允许,SMBUS中断允许
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
PCA_Init();
Timer_Init();
SMBus_Init();
Port_IO_Init();
Oscillator_Init();
Interrupts_Init();
}
void Delay(unsigned char x)
{
unsigned char i, j;
for (i=0; i<x; i++)
{
for (j=0; j<0xff; j++)
{;}
}
}
void Init_TTQH6(void) //初始化器件TTQH6
{
TTQH6_RST0 = 0;
Delay(1);
TTQH6_RST0 = 1;
Delay(5);
}
void main(void)
{
unsigned char check;
// Init_TTQH6(); //初始化器件TTQH6
Init_Device();
_nop_;
_nop_;
_nop_;
_nop_;
_nop_;
_nop_;
BUSY=0;
BUSY=0;
// SM_Send(CHIP_ID,0x01,0x52);
check=SM_Receive(CHIP_ID,0x01);
while(1);
}
void SM_Send(char chip_select,unsigned char byte_address,char out_byte)
{
while(BUSY);
BUSY=1;
SMB0CF = 0xD0; //////////////
count=2;
command=(chip_select|WRITE);
register_add=byte_address;
t_word=out_byte;
STA=1;
while(BUSY);
}
char SM_Receive(char chip_select,unsigned char byte_address)
{
while(BUSY);
BUSY=1;
count=2;
SMB0CF = 0xD0; //////////
rd_flag=1;
flag=1;
command=chip_select|READ;
register_add=byte_address;
STA=1;
while(BUSY);
return r_word;
}
void SmBus_ISR(void) interrupt 7
{
switch(SMB0STA)
{
case SMB_START:
SMB0DAT=(command&0xFE);
STA=0;
break;
case SMB_MTDATADD:
if(ACK)
{
if( rd_flag)
{
SMB0DAT= command;
rd_flag=0;
}
else
{
switch(count)
{
case 2:
SMB0DAT=register_add;
count--;
break;
case 1:
if(flag)
{
break;
}
else
{ SMB0DAT=t_word;
count--;
break;
}
default:
STO=1;
BUSY=0;
break;
}
}
}
else
{ STO=1;
STA=1;
}
break;
case SMB_MRDAT:
r_word=SMB0DAT;
ACK=1;
STO=1;
BUSY=0;
break;
default:
STO=1;
BUSY=0;
break;
}
SI=0;
}
/*void T3_interrupt(void) interrupt 14
{
STO=1;
BUSY=
TMR3CN&=0x7f;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -