C8051F020FM24C16收发测试程序.docx
《C8051F020FM24C16收发测试程序.docx》由会员分享,可在线阅读,更多相关《C8051F020FM24C16收发测试程序.docx(22页珍藏版)》请在冰点文库上搜索。
C8051F020FM24C16收发测试程序
//FM24C16收发测试程序(通过)
//收发有错误是因为收发数组定义长度问题
//ur0第一次收不到30而第二次收的数据又覆盖了部分第一的数据
//SMB的收发也有上述问题造成收发有错误
/**********************************************
文件描述:
三相电测量上报
功能说明:
测量ATT7022B完成
PCF8563上报定时(需校时)
FM24C256转换数据存储
UART0口用于RS232读数据
UART1控制无线模块上报数据
创建:
2006年12月5日
/*********************************
*函数:
main.
*入口:
无
*出口:
*功能说明:
接收UART端口命令
执行读ATT7022B的数据
进行处理、存储和回发数据
********************************/
//*****************************
//包含的文件
//******************************
#include
//*************************************************
//函数:
init_sysclk(void)
//功能:
时钟初始化
//入口:
//出口:
//说明:
使用外部时钟12M
voidinit_sysclk(void)
{
uinti=0;
OSCXCN=0x67;//externaloscillatorwith12MHzcrystal
for(i=0;i<256;i++);//XTLVLDblanking
while(!
(OSCXCN&0x80));//Waitforcrystalosc.tosettle
OSCICN=0x88;//时钟丢失检测,选择外部时钟
CKCON=0x00;//时钟分频
}
函数:
voidenable_wdog(void)
voiddisable_wdog(void)
功能:
使能、禁止wdog
入口:
出口:
说明:
WDTCN=0xA5;
//允许看门狗定时器工作
voiddisable_wdog(void)//禁止看门狗定时器工作
WDTCN=0xDE;
WDTCN=0xAD;
/***********************************
voidinit_ioport()
端口配置及端口位定义
*************************************/
XBR0=0x07;//TXD0-P0.0RXD0-P0.1,SPI_SCK-P0.2,SPI_MISO-P0.3
//SPI_MOSI-P0.4,SPI_NSS-P0.5,SDA-P0.6,SCL-P0.7,
XBR1=0X10;//INT1使能INT1--P1.2
XBR2=0x44;//端口I/O弱上拉允许,TX1-P1.0,RXD-P1.1交叉开关允许
P0MDOUT=0x08;//端口0输出方式寄存器:
0--漏极开路
P1MDIN=0XFF;//端口1输入方式寄存器:
0--配置为数字输入
P1MDOUT=0x00;//端口1输出方式寄存器,0--漏极开路
P1=0xff;
P2MDOUT=0x00;//端口2输出方式寄存器:
P2=0xff;
P3MDOUT=0X00;//端口3输出方式寄存器:
P3=0xff;
P74OUT=0x00;//端口7-4输出方式寄存器:
P4=0xff;
P5=0xff;
P6=0xff;
P7=0xff;
//--------------------------------------------------------------
voidDelay_ms(unsignedms)
//功能:
实现延时功能Timer0_ms
//---------------------------------------------------------------
//
/*ConfigureTimer0todelay*/
uchari;//millisecondcounter
TCON&=~0x30;//STOPTimer0andclearoverflowflag
TMOD|=0x01;//configureTimer0to16-bitmode
CKCON|=0x08;//Timer0countsSYSCLKs
for(i=0;i{TR0=0;//STOPTimer0TH0=(-SYSCLK/1000)>>8;//setTimer0tooverflowin1msTL0=-SYSCLK/1000;TR0=1;//STARTTimer0while(TF0==0);//waitforoverflowTF0=0;//clearoverflowindicator}}//-------------------------------------------------------//函数:voidDelay_us(unsignedus)//功能:实现延时功能Timer0_us//-------------------------------------------------------///*ConfigureTimer0todelay*/voidDelay_us(unsignedus){uchari;//microsecondscounterTCON&=~0x30;//STOPTimer0andclearoverflowflagTMOD|=0x01;//configureTimer0to16-bitmodeCKCON|=0x08;//Timer0countsSYSCLKsfor(i=0;i{TR0=0;//STOPTimer0TH0=(-SYSCLK/1000000)>>8;//setTimer0tooverflowin1usTL0=-SYSCLK/1000000;TR0=1;//STARTTimer0while(TF0==0);//waitforoverflowTF0=0;//clearoverflowindicator}}//***************************************//函数:unsignedcharmy_add(ucharmy_add)//功能:读开关状态确定子地址//入口:无//出口:子地址//说明:子地址存于myadd中(即设备号)//****************************************voidmy_add(void){P74OUT|=0XD0;myadd=P5;}//******************************************//函数:voidjiaob(ATT_JB[])//功能:写校表寄存器//说明:UART口接收校表时间并存于FM24C256中//*****************************************voidjiaob(void){}main(){disable_wdog();//关看门狗init_sysclk();//时钟初始化init_ioport();//交叉开关配置my_add();//读设备子地址设置UART0_Init();//UART0初始化SPI0_Init();init_smbus();EX1=1;//开INT1EA=1;//开中断//SPIEN=1;uart0_flag=0;while(1){if(uart0_flag){uart0_flag=0;//ATT_Read(ur0_rxd[0]);//写fm24c256字节数//写fm24c256字节记数fm_ram_add=0;//写fm24c256起始地址smbus_send(fm_send_len);fm_ram_add=0;smbus_receive(fm_receive_len);m=&fm_read_buf[0];txd_string(m,30);}}}//*******************************************voidinit_smbus(void){SMB0CN=0x44;//IIC总线控制寄存器01000100SMB0CR=0xA4;//-(SYSCLK/2*SCL);IIC总线速率寄存器SCL=100K//允许IIC总线中断,标志位是SI(SMB0CN.3)EIE1|=0x02;//SMBUS中断使能EA=1;//中断使能sm_busy=0;//总线空闲中断接收发完成标志开始置1ENSMB=1;//SMBUS0使能}//-----向给定寄存器地址写一个字节-------//voidsmbus_send(ucharfm_send_len){//fm_send_len=30;//写fm24c256字节数fm_send_count=0;//写fm24c256字节记数while(sm_busy);//WaitforSMBustobefree.sm_busy=1;//OccupySMBus(settobusy)sm_r_s_flag=1;fm_send_len=30;//写fm24c256字节数STO=0;STA=1;//Starttransferwhile(sm_busy);//Waitfortransfertofinish}//-----从给定寄存器地址读一个字节-------//voidsmbus_receive(ucharfm_receive_len){//fm_receive_len=30;//读fm24c256字节数fm_receive_count=0;//读fm24c256字节记数while(sm_busy);//Waitforbustobefree.sm_busy=1;//OccupySMBus(settobusy)sm_r_s_flag=0;fm_receive_len=30;STO=0;STA=1;//Starttransferwhile(sm_busy);//Waitfortransfertofinish}//-----SMBUS中断服务程序---//voidsmbus(void)interrupt7{ES0=0;switch(SMB0STA)//SMBUS状态寄存器SMB0STA{//fm_err_flag=1说明SMBus有问题case0x08:if(sm_r_s_flag)//判断收发{chip_select=0xA0;}elsechip_select=0xA1;//主发送/接收:起始条件已发出.STA=0;fm_err_flag=0;AA=1;//清除起始位STA,应答SMB0DAT=chip_select;//从地址+读/写标志送SMB0DAT,break;case0x10://主发送/接收:重复起始条件已发出。STA=0;AA=1;//人工清除起始位STA,应答SMB0DAT=chip_select;//从地址+读/写标志送SMB0DATbreak;case0x18://主发送器:从地址+写标志已发出,收到ACKSMB0DAT=fm_ram_add;write_num=0;//将要发送的数据装入SMB0DAT.break;case0x20://主发送器:从地址+写标志已发出,收到NACKwrite_num++;if(write_num>5){STO=1;sm_busy=0;fm_err_flag=1;}//如果超过5次不成功则释放总线else{STO=1;STA=1;}//确认查询重复,置位STO+STA。break;case0x28://数据字节已发出,收到ACK,将下一字节装入SMB0DAT;switch(fm_send_len){case0x00:STO=1;sm_busy=0;//如果数据已经发送结束则释放总线break;default:SMB0DAT=ur0_rxd[fm_send_count++];fm_send_len--;break;}break;case0x30://主发送器:数据字节已发出,收到NACK,write_num++;if(write_num>5){STO=1;sm_busy=0;fm_err_flag=1;}//如果超过5次不成功则释放总线else{STO=1;STA=1;}//重试传输或置位STObreak;case0x38://主发送器:竞争失败,保存当前数据write_num++;if(write_num>5){STO=1;sm_busy=0;fm_err_flag=1;}//如果超过5次不成功则释放总线{STO=1;STA=1;}break;case0x40:receive_num=0;//主接收器:从地址+读标志已发出,收到ACK,if(fm_receive_len<30)AA=0;//如果只接收一(30)个字节,清AA位(收到字节后发NACK),等待接收数据break;case0x48://主接收器:从地址+读标志已发出,收到NACK,receive_num++;if(receive_num>5){STO=1;sm_busy=0;fm_err_flag=1;}//如果超过5次不成功则释放总线else{STO=1;STA=1;}break;//确认查询重复,置位STO+STA。case0x50://主接收器:数据字节收到,ACK已发出;读SMB0DAT,等待fm_read_buf[fm_receive_count++]=SMB0DAT;fm_receive_len--;if(fm_receive_len<2)AA=0;//如下一个字节是最后字节,清除AA(nack)。break;case0x58://主接收器:数据字节收到,NACK已发出,置位STO。fm_read_buf[fm_receive_count++]=SMB0DAT;//读操作已经完成,读数据寄存器并且发出STOP.fm_receive_len--;STO=1;sm_busy=0;//FreeSMBusbreak;default:STO=1;sm_busy=0;fm_err_flag=1;//Resetcommunication.break;}SI=0;//clearinterruptflagES0=1;}//---------判断本设备命令及命令内容执行命令-------//-----------------------------------------------------------------------------//SPI0_Init//-----------------------------------------------------------------------------////ConfigureSPI0for8-bit,200KSCK,Mastermode,data//sampledonSCK2stedge.//voidSPI0_Init(void){SPI0CFG=0x87;//datasampledonSCK2stedge//8-bitdatawords,MSB1stSPI0CN=0x02;//Mastermode;SPIenabled;flags//clearedSPI0CKR=0x2F;//SPIclock<=200kHz(limitedby//EEPROMspec.)EIE1&=0XFE;//spi关//开漏}//-----------------------------------------------------------------------------//ATT_Read//-----------------------------------------------------------------------------////ThisroutinereadsandreturnsasingleATT7022bytewhoseaddressis//givenin.//voidATT_Read(ucharx){ucharn=0;ATT_CS=0;//selectatt7022SPIF=0;Delay_us(1);//waitatleast250ns(CSsetuptime)SPI0DAT=x;while(SPIF==0);Delay_us(3);SPIF=0;for(n=0;n<=3;n++){SPI0DAT=0;while(SPIF==0);SPIF=0;ur0_rxd[n]=SPI0DAT;//readdatafromSPI}//readdatafromSPIDelay_us(1);//waitatleast250ns(CSholdtime)ATT_CS=1;//de-selectEEPROMDelay_us(1);//waitatleast500ns(CSdisabletime)}//-----------------------------------------------------------------------------//ATT_Write//-----------------------------------------------------------------------------//voidATT_Write(ucharATT_WADD,ucharatt_wd[]){ucharn;ATT_WADD=ATT_W|ATT_W_ADD;ATT_CS=0;//selectatt7022Delay_us(1);//waitatleast250ns(CSsetuptime)//transmitWriteopcodeSPIF=0;SPI0DAT=ATT_W|ATT_W_ADD;while(SPIF==0);SPIF=0;SPI0DAT=att_wd[n];while(SPIF==0);n=++n;SPIF=0;SPI0DAT=att_wd[n];while(SPIF==0);n=++n;SPIF=0;SPI0DAT=att_wd[n];while(SPIF==0);Delay_us(1);//waitatleast250ns(CSholdtime)ATT_CS=1;}//-----------------------------------------------------//串口初始化//--------------------------------------------------------voidUART0_Init(void){SCON0=
TR0=0;//STOPTimer0
TH0=(-SYSCLK/1000)>>8;//setTimer0tooverflowin1ms
TL0=-SYSCLK/1000;
TR0=1;//STARTTimer0
while(TF0==0);//waitforoverflow
TF0=0;//clearoverflowindicator
//-------------------------------------------------------
voidDelay_us(unsignedus)
实现延时功能Timer0_us
uchari;//microsecondscounter
for(i=0;i{TR0=0;//STOPTimer0TH0=(-SYSCLK/1000000)>>8;//setTimer0tooverflowin1usTL0=-SYSCLK/1000000;TR0=1;//STARTTimer0while(TF0==0);//waitforoverflowTF0=0;//clearoverflowindicator}}//***************************************//函数:unsignedcharmy_add(ucharmy_add)//功能:读开关状态确定子地址//入口:无//出口:子地址//说明:子地址存于myadd中(即设备号)//****************************************voidmy_add(void){P74OUT|=0XD0;myadd=P5;}//******************************************//函数:voidjiaob(ATT_JB[])//功能:写校表寄存器//说明:UART口接收校表时间并存于FM24C256中//*****************************************voidjiaob(void){}main(){disable_wdog();//关看门狗init_sysclk();//时钟初始化init_ioport();//交叉开关配置my_add();//读设备子地址设置UART0_Init();//UART0初始化SPI0_Init();init_smbus();EX1=1;//开INT1EA=1;//开中断//SPIEN=1;uart0_flag=0;while(1){if(uart0_flag){uart0_flag=0;//ATT_Read(ur0_rxd[0]);//写fm24c256字节数//写fm24c256字节记数fm_ram_add=0;//写fm24c256起始地址smbus_send(fm_send_len);fm_ram_add=0;smbus_receive(fm_receive_len);m=&fm_read_buf[0];txd_string(m,30);}}}//*******************************************voidinit_smbus(void){SMB0CN=0x44;//IIC总线控制寄存器01000100SMB0CR=0xA4;//-(SYSCLK/2*SCL);IIC总线速率寄存器SCL=100K//允许IIC总线中断,标志位是SI(SMB0CN.3)EIE1|=0x02;//SMBUS中断使能EA=1;//中断使能sm_busy=0;//总线空闲中断接收发完成标志开始置1ENSMB=1;//SMBUS0使能}//-----向给定寄存器地址写一个字节-------//voidsmbus_send(ucharfm_send_len){//fm_send_len=30;//写fm24c256字节数fm_send_count=0;//写fm24c256字节记数while(sm_busy);//WaitforSMBustobefree.sm_busy=1;//OccupySMBus(settobusy)sm_r_s_flag=1;fm_send_len=30;//写fm24c256字节数STO=0;STA=1;//Starttransferwhile(sm_busy);//Waitfortransfertofinish}//-----从给定寄存器地址读一个字节-------//voidsmbus_receive(ucharfm_receive_len){//fm_receive_len=30;//读fm24c256字节数fm_receive_count=0;//读fm24c256字节记数while(sm_busy);//Waitforbustobefree.sm_busy=1;//OccupySMBus(settobusy)sm_r_s_flag=0;fm_receive_len=30;STO=0;STA=1;//Starttransferwhile(sm_busy);//Waitfortransfertofinish}//-----SMBUS中断服务程序---//voidsmbus(void)interrupt7{ES0=0;switch(SMB0STA)//SMBUS状态寄存器SMB0STA{//fm_err_flag=1说明SMBus有问题case0x08:if(sm_r_s_flag)//判断收发{chip_select=0xA0;}elsechip_select=0xA1;//主发送/接收:起始条件已发出.STA=0;fm_err_flag=0;AA=1;//清除起始位STA,应答SMB0DAT=chip_select;//从地址+读/写标志送SMB0DAT,break;case0x10://主发送/接收:重复起始条件已发出。STA=0;AA=1;//人工清除起始位STA,应答SMB0DAT=chip_select;//从地址+读/写标志送SMB0DATbreak;case0x18://主发送器:从地址+写标志已发出,收到ACKSMB0DAT=fm_ram_add;write_num=0;//将要发送的数据装入SMB0DAT.break;case0x20://主发送器:从地址+写标志已发出,收到NACKwrite_num++;if(write_num>5){STO=1;sm_busy=0;fm_err_flag=1;}//如果超过5次不成功则释放总线else{STO=1;STA=1;}//确认查询重复,置位STO+STA。break;case0x28://数据字节已发出,收到ACK,将下一字节装入SMB0DAT;switch(fm_send_len){case0x00:STO=1;sm_busy=0;//如果数据已经发送结束则释放总线break;default:SMB0DAT=ur0_rxd[fm_send_count++];fm_send_len--;break;}break;case0x30://主发送器:数据字节已发出,收到NACK,write_num++;if(write_num>5){STO=1;sm_busy=0;fm_err_flag=1;}//如果超过5次不成功则释放总线else{STO=1;STA=1;}//重试传输或置位STObreak;case0x38://主发送器:竞争失败,保存当前数据write_num++;if(write_num>5){STO=1;sm_busy=0;fm_err_flag=1;}//如果超过5次不成功则释放总线{STO=1;STA=1;}break;case0x40:receive_num=0;//主接收器:从地址+读标志已发出,收到ACK,if(fm_receive_len<30)AA=0;//如果只接收一(30)个字节,清AA位(收到字节后发NACK),等待接收数据break;case0x48://主接收器:从地址+读标志已发出,收到NACK,receive_num++;if(receive_num>5){STO=1;sm_busy=0;fm_err_flag=1;}//如果超过5次不成功则释放总线else{STO=1;STA=1;}break;//确认查询重复,置位STO+STA。case0x50://主接收器:数据字节收到,ACK已发出;读SMB0DAT,等待fm_read_buf[fm_receive_count++]=SMB0DAT;fm_receive_len--;if(fm_receive_len<2)AA=0;//如下一个字节是最后字节,清除AA(nack)。break;case0x58://主接收器:数据字节收到,NACK已发出,置位STO。fm_read_buf[fm_receive_count++]=SMB0DAT;//读操作已经完成,读数据寄存器并且发出STOP.fm_receive_len--;STO=1;sm_busy=0;//FreeSMBusbreak;default:STO=1;sm_busy=0;fm_err_flag=1;//Resetcommunication.break;}SI=0;//clearinterruptflagES0=1;}//---------判断本设备命令及命令内容执行命令-------//-----------------------------------------------------------------------------//SPI0_Init//-----------------------------------------------------------------------------////ConfigureSPI0for8-bit,200KSCK,Mastermode,data//sampledonSCK2stedge.//voidSPI0_Init(void){SPI0CFG=0x87;//datasampledonSCK2stedge//8-bitdatawords,MSB1stSPI0CN=0x02;//Mastermode;SPIenabled;flags//clearedSPI0CKR=0x2F;//SPIclock<=200kHz(limitedby//EEPROMspec.)EIE1&=0XFE;//spi关//开漏}//-----------------------------------------------------------------------------//ATT_Read//-----------------------------------------------------------------------------////ThisroutinereadsandreturnsasingleATT7022bytewhoseaddressis//givenin.//voidATT_Read(ucharx){ucharn=0;ATT_CS=0;//selectatt7022SPIF=0;Delay_us(1);//waitatleast250ns(CSsetuptime)SPI0DAT=x;while(SPIF==0);Delay_us(3);SPIF=0;for(n=0;n<=3;n++){SPI0DAT=0;while(SPIF==0);SPIF=0;ur0_rxd[n]=SPI0DAT;//readdatafromSPI}//readdatafromSPIDelay_us(1);//waitatleast250ns(CSholdtime)ATT_CS=1;//de-selectEEPROMDelay_us(1);//waitatleast500ns(CSdisabletime)}//-----------------------------------------------------------------------------//ATT_Write//-----------------------------------------------------------------------------//voidATT_Write(ucharATT_WADD,ucharatt_wd[]){ucharn;ATT_WADD=ATT_W|ATT_W_ADD;ATT_CS=0;//selectatt7022Delay_us(1);//waitatleast250ns(CSsetuptime)//transmitWriteopcodeSPIF=0;SPI0DAT=ATT_W|ATT_W_ADD;while(SPIF==0);SPIF=0;SPI0DAT=att_wd[n];while(SPIF==0);n=++n;SPIF=0;SPI0DAT=att_wd[n];while(SPIF==0);n=++n;SPIF=0;SPI0DAT=att_wd[n];while(SPIF==0);Delay_us(1);//waitatleast250ns(CSholdtime)ATT_CS=1;}//-----------------------------------------------------//串口初始化//--------------------------------------------------------voidUART0_Init(void){SCON0=
TH0=(-SYSCLK/1000000)>>8;//setTimer0tooverflowin1us
TL0=-SYSCLK/1000000;
//***************************************
unsignedcharmy_add(ucharmy_add)
读开关状态确定子地址
子地址
//说明:
子地址存于myadd中(即设备号)
//****************************************
voidmy_add(void)
P74OUT|=0XD0;
myadd=P5;
//******************************************
voidjiaob(ATT_JB[])
写校表寄存器
UART口接收校表时间并存于FM24C256中
//*****************************************
voidjiaob(void)
main()
disable_wdog();//关看门狗
init_sysclk();//时钟初始化
init_ioport();//交叉开关配置
my_add();//读设备子地址设置
UART0_Init();//UART0初始化
SPI0_Init();
init_smbus();
EX1=1;//开INT1
EA=1;//开中断//SPIEN=1;
uart0_flag=0;
while
(1)
if(uart0_flag)
uart0_flag=0;//ATT_Read(ur0_rxd[0]);
//写fm24c256字节数
//写fm24c256字节记数
fm_ram_add=0;//写fm24c256起始地址
smbus_send(fm_send_len);
fm_ram_add=0;
smbus_receive(fm_receive_len);
m=&fm_read_buf[0];
txd_string(m,30);
//*******************************************
voidinit_smbus(void)
SMB0CN=0x44;//IIC总线控制寄存器01000100
SMB0CR=0xA4;//-(SYSCLK/2*SCL);IIC总线速率寄存器SCL=100K
//允许IIC总线中断,标志位是SI(SMB0CN.3)
EIE1|=0x02;//SMBUS中断使能
EA=1;//中断使能
sm_busy=0;//总线空闲中断接收发完成标志开始置1
ENSMB=1;//SMBUS0使能
//-----向给定寄存器地址写一个字节-------//
voidsmbus_send(ucharfm_send_len)
//fm_send_len=30;//写fm24c256字节数
fm_send_count=0;//写fm24c256字节记数
while(sm_busy);//WaitforSMBustobefree.
sm_busy=1;//OccupySMBus(settobusy)
sm_r_s_flag=1;
fm_send_len=30;//写fm24c256字节数
STO=0;
STA=1;//Starttransfer
while(sm_busy);//Waitfortransfertofinish
//-----从给定寄存器地址读一个字节-------//
voidsmbus_receive(ucharfm_receive_len)
//fm_receive_len=30;//读fm24c256字节数
fm_receive_count=0;//读fm24c256字节记数
while(sm_busy);//Waitforbustobefree.
sm_r_s_flag=0;
fm_receive_len=30;
//-----SMBUS中断服务程序---//
voidsmbus(void)interrupt7
ES0=0;
switch(SMB0STA)
//SMBUS状态寄存器SMB0STA
//fm_err_flag=1说明SMBus有问题
case0x08:
if(sm_r_s_flag)//判断收发
chip_select=0xA0;
elsechip_select=0xA1;
//主发送/接收:
起始条件已发出.
STA=0;fm_err_flag=0;AA=1;//清除起始位STA,应答
SMB0DAT=chip_select;//从地址+读/写标志送SMB0DAT,
break;
case0x10:
重复起始条件已发出。
STA=0;AA=1;//人工清除起始位STA,应答
SMB0DAT=chip_select;//从地址+读/写标志送SMB0DAT
case0x18:
//主发送器:
从地址+写标志已发出,收到ACK
SMB0DAT=fm_ram_add;write_num=0;//将要发送的数据装入SMB0DAT.
case0x20:
从地址+写标志已发出,收到NACK
write_num++;
if(write_num>5)
STO=1;sm_busy=0;fm_err_flag=1;
}//如果超过5次不成功则释放总线
else{STO=1;STA=1;}//确认查询重复,置位STO+STA。
case0x28:
//数据字节已发出,收到ACK,将下一字节装入SMB0DAT;
switch(fm_send_len)
case0x00:
STO=1;sm_busy=0;//如果数据已经发送结束则释放总线
default:
SMB0DAT=ur0_rxd[fm_send_count++];
fm_send_len--;
case0x30:
数据字节已发出,收到NACK,
else
{STO=1;STA=1;}//重试传输或置位STO
case0x38:
竞争失败,保存当前数据
{STO=1;STA=1;}
case0x40:
receive_num=0;//主接收器:
从地址+读标志已发出,收到ACK,
if(fm_receive_len<30)AA=0;//如果只接收一(30)个字节,清AA位(收到字节后发NACK),等待接收数据
case0x48:
//主接收器:
从地址+读标志已发出,收到NACK,
receive_num++;
if(receive_num>5)
break;//确认查询重复,置位STO+STA。
case0x50:
数据字节收到,ACK已发出;读SMB0DAT,等待
fm_read_buf[fm_receive_count++]=SMB0DAT;
fm_receive_len--;
if(fm_receive_len<2)AA=0;//如下一个字节是最后字节,清除AA(nack)。
case0x58:
数据字节收到,NACK已发出,置位STO。
fm_read_buf[fm_receive_count++]=SMB0DAT;//读操作已经完成,读数据寄存器并且发出STOP.
STO=1;sm_busy=0;//FreeSMBus
STO=1;sm_busy=0;fm_err_flag=1;//Resetcommunication.
SI=0;//clearinterruptflag
ES0=1;
//---------判断本设备命令及命令内容执行命令-------
//-----------------------------------------------------------------------------
//SPI0_Init
//ConfigureSPI0for8-bit,200KSCK,Mastermode,data
//sampledonSCK2stedge.
voidSPI0_Init(void)
SPI0CFG=0x87;//datasampledonSCK2stedge
//8-bitdatawords,MSB1st
SPI0CN=0x02;//Mastermode;SPIenabled;flags
//cleared
SPI0CKR=0x2F;//SPIclock<=200kHz(limitedby
//EEPROMspec.)
EIE1&=0XFE;//spi关
//开漏
//ATT_Read
//ThisroutinereadsandreturnsasingleATT7022bytewhoseaddressis
//givenin.
voidATT_Read(ucharx)
ucharn=0;
ATT_CS=0;//selectatt7022
SPIF=0;
Delay_us
(1);//waitatleast250ns(CSsetuptime)
SPI0DAT=x;
while(SPIF==0);
Delay_us(3);
for(n=0;n<=3;n++)
SPI0DAT=0;
ur0_rxd[n]=SPI0DAT;//readdatafromSPI
}//readdatafromSPI
(1);//waitatleast250ns(CSholdtime)
ATT_CS=1;//de-selectEEPROM
(1);//waitatleast500ns(CSdisabletime)
//ATT_Write
voidATT_Write(ucharATT_WADD,ucharatt_wd[])
ucharn;
ATT_WADD=ATT_W|ATT_W_ADD;
//transmitWriteopcode
SPI0DAT=ATT_W|ATT_W_ADD;
SPI0DAT=att_wd[n];
n=++n;
ATT_CS=1;
//-----------------------------------------------------
//串口初始化
//--------------------------------------------------------
voidUART0_Init(void)
SCON0=
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2