⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fm31xx.c

📁 c8051f020实现4个 产UART 口
💻 C
字号:

#include "all.h"


void FM_eeprom (void) _task_ FMROM {
    EECmd = FM_MEMORY_RD;

	  while (1) {
	  	       Dog_FMROMI_cnt=0; //看门狗计数器
		      os_wait2(K_SIG, 0);
		      Dog_FMROMI_cnt=1; //看门狗计数器
		      if (EETask == 0xff) continue;

		      if (EECmd == FM_MEMORY_WR ) {
			  	
		            write_fm_memory(FM_addr,iic_data_buf,FM_num);
		           // os_wait2(K_TMO, 2);
		      }
		      else if (EECmd == FM_MEMORY_RD) {
		            read_fm_memory(FM_addr,iic_data_buf,FM_num);
		      }
		      if (EETask != 0xff) os_send_signal(EETask);
		      Dog_FMROMI_cnt=0; //看门狗计数器
	 }
}


//void read_fm_memory(unsigned int addr_fm,unsigned char*addr_cpu,unsigned char read_num);
//void write_fm_memory(unsigned int addr_fm,unsigned char *addr_cpu,unsigned char write_num);
//unsigned char  hex_bcd(unsigned char hex_value);
//uchar smbus_send (uchar chip_select,uint iic_address,uchar* cpu_address,uchar write_num);
//uchar smbus_receive (uchar chip_select,uchar* cpu_address,uchar receive_num);



/*
uchar hex_bcd(uchar hex_value)//完成HEX(99以内)到BCD(两位)的确转换
{
    return(((hex_value/10)<<4)|(hex_value%10));
}

*/

   bit     HighB=0;      
uchar  Ttems;
uchar smbus_send (uchar chip_select,uint iic_address,uchar* cpu_address,uchar write_num)
{
	
	uchar send_try_number = 0;
	uchar send_err_flag;
	
     
	while(sm_busy);                       // Wait for SMBus to be free.

		while(send_try_number<4)
		{
			sm_busy = 1;                            // Occupy SMBus (set to busy)
			write_start_num = 0;
			slave_add = chip_select;                // Chip select + WRITE
			HighB=0;
			//if(iic_address>255)  {
			       HighB=1;	 
				   Ttems=(uchar)(iic_address>>7);
				   Ttems&=0x0e;
			        slave_add=slave_add| Ttems;
			//}	
			iic_ram_add = iic_address;             // fm_clock的寄存器地址
			iic_data_len = write_num;               // 写PCF8563字节数
			iic_buf_p = cpu_address;
			
			                               // Start transfer
			DISABLE();
			smbus_ms_cnt = 0;			
			ENABLE();
			
			STA=1; 
			send_err_flag = 0;
			while(sm_busy)    //忙且无中断时间小于50mS        // Wait for transfer to finish
			{
				//wait 
				if((++smbus_ms_cnt>65000))
				{
					//异常停止
					DISABLE();
					send_err_flag = 1;
					sm_busy = 0;
					ENABLE();
					break;
				}
				Delay1us;
			}

			if((iic_error_flag)||(send_err_flag == 1))
			{
				//出错
				send_try_number++;
				SMBus_Init();

			}
			else
			{
				//ok
				
				return 1;		//成功
			}
		}


	return 0;//error return
}


uchar smbus_receive (uchar chip_select,uchar* cpu_address,uchar receive_num)
{    
	
	uchar receive_try_number = 0;
	uchar receive_err_flag;

	
	if(receive_num)
	{
		while (sm_busy);                    // Wait for bus to be free.
		while(receive_try_number<4)
		{
			sm_busy = 1;                          // Occupy SMBus (set to busy)
			read_start_num = 0;
			slave_add = chip_select;              // Chip select + READ
			
			if(HighB==1) {
					 
				
			          slave_add=slave_add| Ttems;
			
			}
			 
			iic_data_len = receive_num; 
			iic_buf_p = cpu_address;
			
			STA = 1;                              // Start transfer
			DISABLE();
			smbus_ms_cnt = 0;
			ENABLE();
			receive_err_flag = 0;
			
			while(sm_busy)    //忙且无中断时间小于50mS        // Wait for transfer to finish
			{
				//wait 
				if((++smbus_ms_cnt>50000))
				{
					//异常停止
					DISABLE();
					receive_err_flag = 1;
					sm_busy = 0;
					ENABLE();
					break;
				}
				Delay1us;
			}

			if(iic_error_flag||(receive_err_flag == 1))
			{
				//出错
				receive_try_number++;
				SMBus_Init();
			}
			else
			{
				//ok
			
				return 1;		//成功
			}
		}
		
		
	}
	
	return 0;//error return

}




void read_fm_memory(unsigned int addr_fm,unsigned char *addr_cpu,unsigned char read_num)
{
      smbus_send(FM_MEMORY_WR,addr_fm,addr_cpu,0);			//set fm_memory addr
	smbus_receive(FM_MEMORY_RD,addr_cpu,read_num);
}


void write_fm_memory(unsigned int addr_fm,unsigned char *addr_cpu,unsigned char write_num)
{  uchar mmk;
    mmk=smbus_send(FM_MEMORY_WR,addr_fm,addr_cpu,write_num);
	if(mmk)
   	   mmk=12;
	else
		mmk=0;

}







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -