为什么在使用SMBUS串口时还需要将UART的交叉开关使能.doc
上传人:sy****28 上传时间:2024-09-14 格式:DOC 页数:7 大小:41KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

为什么在使用SMBUS串口时还需要将UART的交叉开关使能.doc

为什么在使用SMBUS串口时还需要将UART的交叉开关使能.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

[求助]为什么在使用SMBUS串口时还需要将UART的交叉开关使能/*小弟现在在努力学习SMBUS串口,程序中还用到SPI端口,在调试程序过程中,发现开关使能寄存器必须设置成XBR0=0x07,其中bit0是UART,bit1是SPI,bit2是SMBUS。如果设置成XBR0=0x06时,在发送数据时就不会收到从器件(AT24C02)的发送的ACK(确认)信号,无法完成传送到。搞不明白了,我在进行SMBUS和SPI串口通讯,为什么还要将UART的交叉位使能?!以下是源程序,请大虾们耐心看完,给小弟提个建议,谢谢了*/#include"C8051F320.h"#defineI2C_add_W0xa0//24C02硬件地址_写1,0,1,0A2,A1,A0,R/W#defineI2C_add_R0xa1//24C02硬件地址_读sbitKEY1=P2^0;sbitKEY2=P2^1;sbitKEY3=P2^2;sbitKEY4=P2^3;sbitSPI_CS=P1^7;bitSM_Busy;unsignedcharCommand;//命令缓存unsignedchar*I2CDataBuff;//待数据、接收数据指针unsignedcharByteNumber;//数据和C02子地址的字节总数unsignedcharLED_CODE[17]={0x3f,0x06,0x5b,0x4f};//0-3voidDelayMs(unsignedintn)//延时(n)MS{unsignedinti;for(;n>0;n--){for(i=1200;i>0;i--);}}voidSMBusInit(void)//SMBus初始化{SMB0CF=0x90;//启动SMBUS,数据传输中,T0溢出为时钟源TMOD|=0x02;CKCON&=0xF8;TH0=253;TR0=1;EIE1=EIE1|0x01;//允许SMBus中断}/*---------BytesAddress:待存入的数据-----------------------------------------------RomAddress:C02存储单元首地址--------------------------------------------Count:带存入的数据个数-----------------------------------------*/voidWriteI2C(unsignedchar*BytesAddress,unsignedcharRomAddress,unsignedcharCount){unsignedcharTempBuff[16],n;Command=I2C_add_W;//传送写地址命令进入CommandTempBuff[0]=RomAddress;//把"0"送入TempBuff[0]中for(n=1;n<(Count+1);n++)//待存入C02的数据列{TempBuff[n]=*BytesAddress++;//将"1"送入TempBuff[1]}while(SM_Busy);I2CDataBuff=&TempBuff[0];//将TempBuff[0]的地址送给I2CDataBuff指针SM_Busy=1;ByteNumber=Count+1;//ByteNumber=2STA=1;//发送一个起始命令后while(SM_Busy);}/*---------BytesAddress:待取出的数据-----------------------------------------------RomAddress:C02存储单元首地址--------------------------------------------Count:带取出的数据个数-----------------------------------------*/voidReadI2C(unsignedchar*BytesAddress,unsignedcharRomAddress,unsignedcharCount){unsignedcharTempBuff[2];TempBuff[0]=RomAddress;while(SM_Busy);Command=I2C_add_W;I2CDataBuff=&TempBuff[0];SM_Busy=1;ByteNumber=1;STA=1;while(SM_Busy);Command=I2C_add_R;I2CDataBuff=BytesAddress;ByteNumber=Count;SM_Busy=1;STA=1;while(SM_Busy);}unsignedcharKey_scan(void)/