4501|2

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

c8051f920SMBus读写EEPROM数据不正确 求高人指点 [复制链接]

#include "compiler_defs.h"
#include "C8051F930_defs.h"
#include "string.h"

#define uint unsigned int
#define uchar unsigned char

void Timer_Init()
{
TMOD = 0x02;
TH0 = 0xD7;
TH1 = 0xAE; //定时器T0作为SCL的位发生器
TMR3RLL = 0x9E; //定时器T3做,SCL超时检测 25ms
TMR3RLH = 0x38;
TR0 = 1;
TMR3CN |= 0x04;
}

void PCA_Init()
{
PCA0MD &= ~0x40;
PCA0MD = 0x00;
}

void SMBus_Init() //SMBus初始化
{
SMB0CF = 0xCC;
}

void Port_IO_Init() //初始化SMBus管脚
{
// P0MDOUT = 0x30; //初始化出现错误,不应该出现的错误!!!!!
P0SKIP = 0x0F;
XBR0 = 0x04;
XBR2 = 0x40;

}

void Oscillator_Init() //系统晶振选择24.5Mhz
{
FLSCL = 0x40;
OSCICN = 0x8F;
CLKSEL = 0x00;
}

void Interrupts_Init() //总中断和SMBus中断允许
{
EIE1 = 0x80;
IE = 0x80;
}

void Init_Device(void)
{
PCA_Init();
Timer_Init();
SMBus_Init();
Port_IO_Init();
Oscillator_Init();
Interrupts_Init();
}

void smbusreset()
{
uint j;
while(!SDA)
{
XBR2 = 0x40;
SCL = 0;
for(j=0;j<255;j++);
SCL = 1;
while(!SCL);
for(j=0;j<10;j++);
XBR2 = 0x00;
}
XBR2 = 0x40;
}

void Write_B_to_EEP(uchar addr3, uchar ch) //向EEP写一个字节
{
uint i;


SI = 0;
STO = 0;

for(i=0;i<20;i++);

STA = 1;
while(!SI);
STA = 0;
SMB0DAT = 0xa0; //写
SI = 0;

while(!SI);
SMB0DAT = addr3;
SI = 0; //SMB0CN = C3H

while(!SI);
SMB0DAT = ch;
SI = 0;

while(!SI);
STO = 1; //SMB0CN = E1H SMB0DAT = 00H SMB0ADM = FEH
SI = 0;

}

unsigned char Read_B_from_EEP(uchar addr2) //读取某特定地址的函数,返回读取的数据
{
uint i;


SI = 0;
STO = 0;

for(i=0;i<20;i++);

STA = 1;
while(!SI);
STA = 0;
SMB0DAT = 0xa0; //写
SI = 0;

while(!SI);
SMB0DAT = addr2;
SI = 0;

while(!SI);
SI = 0;

STA = 1;
while(!SI);
SMB0DAT = 0xa1; //读
SI = 0;
STA = 0;

while(!SI); //变为主接收
SI = 0;


while(!SI);
ACK = 0;
SI = 0;

STO = 1; //SMB0CN = E1H SMB0DAT = 00H SMB0ADM = FEH

return SMB0DAT;
}

void main()
{
uchar ch1;

Init_Device();
// smbusreset(); //使用时跳不出循环,疑问二??

while(1)
{
Write_B_to_EEP(0x01,0x66);
ch1 = Read_B_from_EEP(0x01); //读写数据不对,疑问二??
if(ch1==0x35)
{
LED = 0;
}
}
}

void Timer3_Interrupt(void) interrupt 14
{
SMB0CF &= ~0x80; // Disable SMBus
SMB0CF |= 0x80; // Re-enable SMBus
TMR3CN &= ~0x80; // Clear Timer3 interrupt-pending flag
}
此帖出自单片机论坛

最新回复

  我记得C8051F的官方例程里有SMBus读写AT24Cxx的例程,你找找看看。  详情 回复 发表于 2011-12-10 09:47
点赞 关注
 

回复
举报

2751

帖子

0

TA的资源

裸片初长成(初级)

沙发
 

原帖由 chenhaishu 于 2011-12-9 20:00 发表 #include "compiler_defs.h"#include "C8051F930_defs.h"#include "string.h"#define uint unsigned int#define uchar unsigned charvoid Timer_Init(){TMOD = 0x02;TH0 = 0xD7;TH1 = 0xAE; //定时器T0作为SCL的位发 ...

 

我记得C8051F的官方例程里有SMBus读写AT24Cxx的例程,你找找看看。

此帖出自单片机论坛
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

回复 沙发 David_Lee 的帖子

我在个就是参照那个修改的 可是一直不对 谢谢
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表