📄 fm31xx.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 + -