Parcourir la source

更新MCU驱动(iram和sram-nos)
1. 优化英飞凌spi nor flash芯片的初始化逻辑,强制清除infineon芯片CFR3N的bit3,防止flash为uniform sector模式。
2. 优化sfud驱动,仅对CFR2N寄存器做dummy cycle判断逻辑。
3. RTC模块CAN唤醒源配置时强制关闭滤波功能,避免唤醒异常。

helen il y a 1 semaine
Parent
commit
f12956c112

+ 8 - 0
amt630hv160-mcu/amt630hv160-mcu-iram/src/ArkmicroFiles/libcpu-amt630hv160/source/amt630hv160_rtc.c

@@ -301,6 +301,14 @@ void RTC_SetWakeup(eRTCWakeupSource src, eRTCWakeupMode mode, int enable)
 			val |= 1 << (mbit - 1);
 			break;
 		}
+
+		//CANx force disable of filter to prevent failure to wake up.
+		if ((src == RTC_WAKEUP_CAN1) || (src == RTC_WAKEUP_CAN0)) {
+			mbit = 18 + RTC_WAKEUP_CAN0 - src;
+			val = RTC->RAM_L;
+			val |= (1 << mbit);
+			RTC_WriteReg(RTC_RAML, &RTC->RAM_L, val);
+		}
 	}
 
 	enbit = 26 + (src - RTC_WAKEUP_GPIO1);

+ 1 - 1
amt630hv160-mcu/amt630hv160-mcu-iram/src/lib/sfud/src/sfud.c

@@ -1325,7 +1325,7 @@ sfud_err sfud_read_register(const sfud_flash *flash, uint32_t addr, uint8_t *val
                     return result;
                 }
                 *value = (((tmp_data[0] << 16) | (tmp_data[1] << 8) | tmp_data[2]) >> (16 - dummy_cycles_cnt)) & 0xff;
-                if ((*value & 0xf) != dummy_cycles_cnt) {
+                if ((addr == 0x00000003) && ((*value & 0xf) != dummy_cycles_cnt)) {
                     return SFUD_ERR_READ;
                 }
             }

+ 18 - 0
amt630hv160-mcu/amt630hv160-mcu-iram/src/main.c

@@ -539,6 +539,24 @@ static void MainTask(void *pvParameters)
 				}
 			}
 
+			//prevent the bit 3 of CFG3x from being 1.
+			result = sfud_read_register(sflash, 0x00800004, &status, SFUD_CMD_READ_REGISTER_INFINEON);
+			if (result != SFUD_SUCCESS) {
+				printf("sfud read CFR3N status register fail\n");
+				vTaskDelete(NULL);
+				return;
+			}
+			//printf("CFR3N status:0x%x.\n", status);
+			if (status & (1 << 3)) {
+				status &= ~(1 << 3);	//forceclear
+				result = sfud_write_register(sflash, 0x00000004, status, SFUD_CMD_WRITE_REGISTER_INFINEON);
+				if (result != SFUD_SUCCESS) {
+					printf("sfud write CFR3N status register fail\n");
+					vTaskDelete(NULL);
+					return;
+				}
+			}
+
 			/* 为了兼容其它型号的nor flash,将dummy cycle由原默认值 8 配置为 4 (非易失)*/
 			//read CFRV2
 			result = sfud_read_register(sflash, 0x00000003, &status, SFUD_CMD_READ_REGISTER_INFINEON);

+ 8 - 0
amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/ArkmicroFiles/libcpu-amt630hv160/source/amt630hv160_rtc.c

@@ -301,6 +301,14 @@ void RTC_SetWakeup(eRTCWakeupSource src, eRTCWakeupMode mode, int enable)
 			val |= 1 << (mbit - 1);
 			break;
 		}
+
+		//CANx force disable of filter to prevent failure to wake up.
+		if ((src == RTC_WAKEUP_CAN1) || (src == RTC_WAKEUP_CAN0)) {
+			mbit = 18 + RTC_WAKEUP_CAN0 - src;
+			val = RTC->RAM_L;
+			val |= (1 << mbit);
+			RTC_WriteReg(RTC_RAML, &RTC->RAM_L, val);
+		}
 	}
 
 	enbit = 26 + (src - RTC_WAKEUP_GPIO1);

+ 1 - 1
amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/lib/sfud/src/sfud.c

@@ -1325,7 +1325,7 @@ sfud_err sfud_read_register(const sfud_flash *flash, uint32_t addr, uint8_t *val
                     return result;
                 }
                 *value = (((tmp_data[0] << 16) | (tmp_data[1] << 8) | tmp_data[2]) >> (16 - dummy_cycles_cnt)) & 0xff;
-                if ((*value & 0xf) != dummy_cycles_cnt) {
+                if ((addr == 0x00000003) && ((*value & 0xf) != dummy_cycles_cnt)) {
                     return SFUD_ERR_READ;
                 }
             }

+ 16 - 0
amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/main.c

@@ -299,6 +299,22 @@ int main(void)
 				}
 			}
 
+			//prevent the bit 3 of CFG3x from being 1.
+			result = sfud_read_register(sflash, 0x00800004, &status, SFUD_CMD_READ_REGISTER_INFINEON);
+			if (result != SFUD_SUCCESS) {
+				printf("sfud read CFR3N status register fail\n");
+				while(1);
+			}
+			//printf("CFR3N status:0x%x.\n", status);
+			if (status & (1 << 3)) {
+				status &= ~(1 << 3);	//forceclear
+				result = sfud_write_register(sflash, 0x00000004, status, SFUD_CMD_WRITE_REGISTER_INFINEON);
+				if (result != SFUD_SUCCESS) {
+					printf("sfud write CFR3N status register fail\n");
+					while(1);
+				}
+			}
+
 			/* 为了兼容其它型号的nor flash,将dummy cycle由原默认值 8 配置为 4 (非易失)*/
 			//read CFRV2
 			result = sfud_read_register(sflash, 0x00000003, &status, SFUD_CMD_READ_REGISTER_INFINEON);