我的产品是主机通过485和48个分机通讯。分机地址1-48,设置后存储在flash模拟的ee里,这种方式我在st系列的100和103都用过以前没有发现问题,
这次客户在现场 由于接线错误,造成24V开关电源电压异常,结果我的所有48个分机设置的地址全部变成1(1是程序默认值),就是由于接线错误造成,数据出错,这种问题在我公司
以前从来没有出现过,我也是现在只有这么认为是电压问题导致数据出错,
我的分机供电是主机的24V开关电源给分机供电,分机是24V---34063(5V)---1117-3.3(3.3V)给单片机。现在48个分机同时数据出错(就是变成了默认数据),
各位大侠 有谁遇到这样情况么?
单片机是stm32F100C8t6,
我现在做的实验是,用3.3V无规律的给单片机通断电也没有发现数据错误或者异常。。。
真不知道这次客户的4个分机到底怎么了?
下面是我的写入函数:
void FLASH_write(void)//дÈëÊý¾Ý
{
uint16_t number;
uint32_t Address = 0x00;
uint8_t *p;
volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;
FLASH_UnlockBank1();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
while (FLASH_ErasePage(BANK1_WRITE_START_ADDR)!= FLASH_COMPLETE);
Address = BANK1_WRITE_START_ADDR;
set_data.crc = crc_cal((unsigned char *)&set_data, sizeof(set_data)-2);
p=(void *)&set_data;
number=512;
while ((number--) && (FLASHStatus == FLASH_COMPLETE))
{
FLASHStatus = FLASH_ProgramHalfWord(Address,*p );
Address = Address +2;
p++;
// DelayMs(1);
// IWDG_Feed();
}
FLASH_LockBank1();
buzz_delay=2;
}
//下面是读取数据函数
void FLASH_deal(void)//¶ÁÈ¡
{
uint16_t number,i;
uint32_t Address = 0x00;
uint8_t *p;
volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;
Address = BANK1_WRITE_START_ADDR;
p=(void *)&set_data;
number=512;
while (number--)
{
*p=*(vu16*) Address;
p++;
Address = Address +2;
}
if((crc_cal((unsigned char *)&set_data, sizeof(set_data)-2) != set_data.crc))
{
set_data.keyword_1 = 0;
set_data.keyword_2 = 0;
set_data.keyword_3 = 0;
set_data.keyword_4 = 0;
set_data.num_of_tantou=6;
set_data.printer = 1;
set_data.bat = 1;
set_data.net_addr = 0xe0;
set_data.cur_addr_24c256 = 0;
set_data.full_24c256 = 0;
FLASH_write();
}
}
|