瀏覽代碼

update:软件定时器控制更加严格,优化恶劣环境下SPI SDHC读取的稳定性,ADC额外获取换算好的电压值
fix:i2c no ack没有启动
add:启用了i2c tools功能

alienwalker 3 年之前
父節點
當前提交
2f1c0d2c7d

+ 1 - 1
application/include/luat_conf_bsp.h

@@ -63,7 +63,7 @@
 #define LUAT_USE_ZLIB 
 #define LUAT_USE_CAMERA  1
 #define LUAT_USE_FATFS 1
-
+#define LUAT_USE_I2CTOOLS 1
 #define LUAT_USE_SOFTKB 1
 
 //----------------------------

+ 1 - 2
application/src/luat_adc_air105.c

@@ -66,9 +66,8 @@ int luat_adc_open(int ch, void *args)
 int luat_adc_read(int ch, int *val, int *val2)
 {
     int voltage = 0;
-    voltage = ADC_GetChannelValue(ch);
+    voltage = ADC_GetChannelValue(ch, val2);
     *val = voltage;
-    *val2 = voltage;
     return 0;
 }
 

+ 1 - 1
application/src/luat_malloc_air105.c

@@ -49,7 +49,7 @@ void luat_heap_free(void* ptr) {
 }
 
 void* luat_heap_realloc(void* ptr, size_t len) {
-    return OS_Realloc(ptr,len);
+    return OS_Realloc(ptr, len);
 }
 
 void* luat_heap_calloc(size_t count, size_t _size) {

+ 11 - 2
bsp/air105/hal/core_adc.c

@@ -204,7 +204,7 @@ void ADC_ChannelOnOff(uint8_t Channel, uint8_t OnOff)
 
 }
 
-uint32_t ADC_GetChannelValue(uint8_t Channel)
+uint32_t ADC_GetChannelValue(uint8_t Channel, uint32_t *Vol)
 {
 
 	uint32_t total= 0;
@@ -228,7 +228,16 @@ uint32_t ADC_GetChannelValue(uint8_t Channel)
 		total += value;
 	}
 	ADC0->ADC_CR1 = 0;
-	return ((total - max) -min)/(SAMPLE_PER_CH-7);
+	value = ((total - max) -min)/(SAMPLE_PER_CH-7);
+	if (!Channel)
+	{
+		*Vol = (value * 5000 / 4095);
+	}
+	else
+	{
+		*Vol = (value * 1800 / 4095);
+	}
+	return value;
 }
 
 #ifdef __BUILD_APP__

+ 5 - 0
bsp/air105/hal/core_debug.c

@@ -410,6 +410,11 @@ void DBG_Send(void)
 	OS_ExitCritical(Critical);
 }
 
+int _write(int file, char *ptr, int len)
+{
+    add_printf_data(ptr, len);
+    return len;
+}
 
 #endif
 

+ 27 - 8
bsp/air105/hal/core_i2c.c

@@ -95,10 +95,19 @@ static int32_t prvI2C_TimerUpCB(void *pData, void *pParam)
 
 static void I2C_IrqHandle(int32_t IrqLine, void *pData)
 {
+	int32_t result = ERROR_NONE;
 	I2C_TypeDef *I2C = prvI2C.RegBase;
+	uint32_t Source = I2C->IC_TX_ABRT_SOURCE;
 	uint32_t State = I2C->IC_RAW_INTR_STAT;
 	uint32_t RegValue = I2C->IC_CLR_INTR;
 
+	if (Source & 0x0000ffff)
+	{
+//		DBG("error stop state %d, result 0x%x", prvI2C.State, Source);
+		result = -ERROR_OPERATION_FAILED;
+		goto I2C_DONE;
+	}
+
 	switch(prvI2C.State)
 	{
 	case I2C_STATE_WRITE_ADDRESS:
@@ -135,7 +144,7 @@ static void I2C_IrqHandle(int32_t IrqLine, void *pData)
 			{
 				I2C->IC_DATA_CMD = I2C_IC_DATA_CMD_CMD|I2C_IC_DATA_CMD_STOP;
 			}
-			I2C->IC_INTR_MASK = I2C_IC_INTR_MASK_M_RX_FULL|I2C_IC_INTR_MASK_M_STOP_DET;
+			I2C->IC_INTR_MASK = I2C_IC_INTR_MASK_M_RX_FULL|I2C_IC_INTR_MASK_M_STOP_DET|I2C_IC_INTR_MASK_M_TX_ABRT;
 		}
 		break;
 	case I2C_STATE_READ_ADDRESS_RD:
@@ -168,14 +177,24 @@ static void I2C_IrqHandle(int32_t IrqLine, void *pData)
 I2C_DONE:
 	Timer_Stop(prvI2C.ToTimer);
 	I2C->IC_INTR_MASK = 0;
-	prvI2C_Done(0, ERROR_NONE);
+	prvI2C_Done(0, result);
 }
 
 static void I2C_IrqHandleRegQueue(int32_t IrqLine, void *pData)
 {
+	int32_t result = ERROR_NONE;
 	I2C_TypeDef *I2C = prvI2C.RegBase;
+	uint32_t Source = I2C->IC_TX_ABRT_SOURCE;
 	uint32_t State = I2C->IC_RAW_INTR_STAT;
 	uint32_t RegValue = I2C->IC_CLR_INTR;
+
+	if (Source & 0x0000ffff)
+	{
+//		DBG("error stop state %d, result 0x%x", prvI2C.State, Source);
+		result = -ERROR_OPERATION_FAILED;
+		goto I2C_DONE;
+	}
+
 	if (State & I2C_IT_TXE)
 	{
 		Timer_StartMS(prvI2C.ToTimer, prvI2C.TimeoutMs, 0);
@@ -209,7 +228,7 @@ static void I2C_IrqHandleRegQueue(int32_t IrqLine, void *pData)
 I2C_DONE:
 	Timer_Stop(prvI2C.ToTimer);
 	I2C->IC_INTR_MASK = 0;
-	prvI2C_Done(0, ERROR_NONE);
+	prvI2C_Done(0, result);
 }
 
 void I2C_GlobalInit(void)
@@ -263,11 +282,11 @@ void I2C_Prepare(uint8_t I2CID, uint16_t ChipAddress, uint8_t ChipAddressLen, CB
 	{
 	case 1:
 		I2C->IC_TAR = ChipAddress & 0x00ff;
-		I2C->IC_SAR = ChipAddress & 0x00ff;
+		if (ChipAddress) I2C->IC_SAR = ChipAddress & 0x00ff;
 		break;
 	case 2:
 		I2C->IC_TAR = I2C_IC_TAR_10BITADDR_MASTER | (ChipAddress & I2C_IC_TAR_TAR);
-		I2C->IC_SAR = ChipAddress;
+		if (ChipAddress) I2C->IC_SAR = ChipAddress;
 		break;
 	}
 	I2C->IC_ENABLE = 1;
@@ -318,7 +337,7 @@ void I2C_MasterXfer(uint8_t I2CID, uint8_t Operate, uint8_t RegAddress, uint8_t
 
 		prvI2C.State = I2C_STATE_READ_ADDRESS_WR;
 		I2C->IC_DATA_CMD = I2C_IC_DATA_CMD_RESTART|RegAddress;
-		I2C->IC_INTR_MASK = I2C_IC_INTR_MASK_M_TX_EMPTY|I2C_IC_INTR_MASK_M_STOP_DET;
+		I2C->IC_INTR_MASK = I2C_IC_INTR_MASK_M_TX_EMPTY|I2C_IC_INTR_MASK_M_STOP_DET|I2C_IC_INTR_MASK_M_TX_ABRT;
 		break;
 	case I2C_OP_READ:
 		prvI2C.State = I2C_STATE_READ_ADDRESS_RD;
@@ -330,7 +349,7 @@ void I2C_MasterXfer(uint8_t I2CID, uint8_t Operate, uint8_t RegAddress, uint8_t
 		{
 			I2C->IC_DATA_CMD = I2C_IC_DATA_CMD_CMD|I2C_IC_DATA_CMD_STOP;
 		}
-		I2C->IC_INTR_MASK = I2C_IC_INTR_MASK_M_RX_FULL|I2C_IC_INTR_MASK_M_STOP_DET;
+		I2C->IC_INTR_MASK = I2C_IC_INTR_MASK_M_RX_FULL|I2C_IC_INTR_MASK_M_STOP_DET|I2C_IC_INTR_MASK_M_TX_ABRT;
 		break;
 	case I2C_OP_WRITE:
 		prvI2C.State = I2C_STATE_WRITE_ADDRESS;
@@ -343,7 +362,7 @@ void I2C_MasterXfer(uint8_t I2CID, uint8_t Operate, uint8_t RegAddress, uint8_t
 			I2C->IC_DATA_CMD = prvI2C.DataBuf.Data[0]|I2C_IC_DATA_CMD_STOP;
 		}
 		prvI2C.DataBuf.Pos++;
-		I2C->IC_INTR_MASK = I2C_IC_INTR_MASK_M_TX_EMPTY|I2C_IC_INTR_MASK_M_STOP_DET;
+		I2C->IC_INTR_MASK = I2C_IC_INTR_MASK_M_TX_EMPTY|I2C_IC_INTR_MASK_M_STOP_DET|I2C_IC_INTR_MASK_M_TX_ABRT;
 		break;
 	default:
 		Timer_Stop(prvI2C.ToTimer);

+ 8 - 6
bsp/air105/hal/core_timer.c

@@ -105,8 +105,12 @@ static int32_t Timer_AddNew(void *pData, void *pParam)
 static int32_t Timer_CheckTo(void *pData, void *pParam)
 {
 	Timer_t *OldTimer = (Timer_t *)pData;
-	if ((OldTimer->TargetTick - SYS_TIMER_1US/4) <= prvTimerCtrl.NextTick)
+	if (OldTimer->TargetTick <= prvTimerCtrl.NextTick)
 	{
+		if (OldTimer->TargetTick < prvTimerCtrl.NextTick)
+		{
+			DBG("%u", (uint32_t)(prvTimerCtrl.NextTick - OldTimer->TargetTick));
+		}
 		return 1;
 	}
 	return 0;
@@ -123,7 +127,7 @@ static void SystemTimerIrqHandler( int32_t Line, void *pData)
 
 	if (prvTimerCtrl.NextTick > GetSysTick())
 	{
-		DBG("%x, %llu, %llu", clr, prvTimerCtrl.NextTick, GetSysTick());
+//		DBG("%u",  (uint32_t)(prvTimerCtrl.NextTick - GetSysTick()));
 		prvTimerCtrl.NextTick = GetSysTick();
 	}
 	do
@@ -248,7 +252,6 @@ int Timer_Start(Timer_t *Timer, uint64_t Tick, uint8_t IsRepeat)
 {
 	uint32_t Critical = OS_EnterCritical();
 	llist_del(&Timer->Node);
-	OS_ExitCritical(Critical);
 	if (IsRepeat)
 	{
 		Timer->AddTick = Tick;
@@ -258,7 +261,6 @@ int Timer_Start(Timer_t *Timer, uint64_t Tick, uint8_t IsRepeat)
 		Timer->AddTick = 0;
 	}
 	Timer_Update(Timer, Tick, 1);
-	Critical = OS_EnterCritical();
 	if (llist_empty(&prvTimerCtrl.Head))
 	{
 		llist_add_tail(&Timer->Node, &prvTimerCtrl.Head);
@@ -270,8 +272,8 @@ int Timer_Start(Timer_t *Timer, uint64_t Tick, uint8_t IsRepeat)
 			llist_add_tail(&Timer->Node, &prvTimerCtrl.Head);
 		}
 	}
-	OS_ExitCritical(Critical);
 	Timer_SetNextIsr();
+	OS_ExitCritical(Critical);
 	return 0;
 }
 
@@ -295,8 +297,8 @@ void Timer_Stop(Timer_t *Timer)
 	if (prvTimerCtrl.Head.next == &Timer->Node)
 	{
 		llist_del(&Timer->Node);
-		OS_ExitCritical(Critical);
 		Timer_SetNextIsr();
+		OS_ExitCritical(Critical);
 		return;
 	}
 	else

+ 1 - 1
bsp/air105/include/core_adc.h

@@ -36,7 +36,7 @@ void ADC_ChannelOnOff(uint8_t Channel, uint8_t OnOff);
  * @param Channel 通道号
  * @return != ADC_VALUE_ERROR 为有效值
  */
-uint32_t ADC_GetChannelValue(uint8_t Channel);
+uint32_t ADC_GetChannelValue(uint8_t Channel, uint32_t *Vol);
 /**
  * @brief 开关内部分压,1~5都是1:1 6就不确定了,手册和demo不一致
  *

+ 24 - 7
bsp/air105/test/full_ota_test.c

@@ -23,11 +23,13 @@
 static uint32_t CRC32_Table[256];
 static uint32_t DataBuf[16 * 1024];
 static uint32_t DataBufBak[16 * 1024];
+static SPIFlash_CtrlStruct SPIFlash;
 void OutFlash_Test(void)
 {
+
 	CoreUpgrade_HeadStruct Head;
 	uint32_t copyaddr, flag, crc32;
-	uint32_t AppInfo[4];
+	uint32_t AppInfo[4], i;
 	PV_Union uPV;
 	CRC32_CreateTable(CRC32_Table, CRC32_GEN);
 	memcpy(AppInfo, __FLASH_APP_START_ADDR__, sizeof(AppInfo));
@@ -36,7 +38,11 @@ void OutFlash_Test(void)
 		DBG("test ok!");
 		return;
 	}
-	SPIFlash_CtrlStruct SPIFlash;
+	else
+	{
+		DBG("%x", AppInfo[2]);
+	}
+
 	memset(&SPIFlash, 0, sizeof(SPIFlash));
 	SPIFlash.SpiID = SPI_ID1;
 	crc32 = CRC32_Cal(CRC32_Table, __FLASH_APP_START_ADDR__, 1024 * 1024, 0xffffffff);
@@ -64,16 +70,26 @@ void OutFlash_Test(void)
 			flag = 1;
 			DataBuf[2] = __APP_START_MAGIC__;
 		}
+
 		SPIFlash_Erase(&SPIFlash, copyaddr - __FLASH_APP_START_ADDR__, 65536);
 		SPIFlash_Write(&SPIFlash, copyaddr - __FLASH_APP_START_ADDR__, DataBuf, 65536);
 		SPIFlash_Read(&SPIFlash, copyaddr - __FLASH_APP_START_ADDR__, DataBufBak, 65536, 1);
 		if (memcmp(DataBuf, DataBufBak, 65536))
 		{
-			DBG("%x, %x, %x, %x", DataBuf[0], DataBuf[256], DataBufBak[0], DataBufBak[256]);
+			for(i = 0; i < 16 * 1024; i++)
+			{
+				if (DataBuf[i] != DataBufBak[i])
+				{
+					DBG("%u, %x, %x", i, DataBuf[i], DataBufBak[i]);
+					break;
+				}
+			}
 		}
+
 		Head.DataCRC32 = CRC32_Cal(CRC32_Table, DataBuf, 65536, Head.DataCRC32);
 		WDT_Feed();
 	}
+
 	Head.MaigcNum = __APP_START_MAGIC__;
 	uPV.u8[0] = CORE_OTA_MODE_FULL;
 	uPV.u8[1] = CORE_OTA_OUT_SPI_FLASH;
@@ -87,8 +103,9 @@ void OutFlash_Test(void)
 	Head.DataStartAddress = 0;
 	Head.DataLen = 1024 * 1024;
 	Head.CRC32 = CRC32_Cal(CRC32_Table, &Head.Param1, sizeof(Head) - 8, 0xffffffff);
-	Flash_EraseSector(__FLASH_OTA_INFO_ADDR__, 0);
-	Flash_ProgramData(__FLASH_OTA_INFO_ADDR__, &Head, sizeof(Head), 0);
+
+	Flash_Erase(__FLASH_OTA_INFO_ADDR__, __FLASH_SECTOR_SIZE__);
+	Flash_Program(__FLASH_OTA_INFO_ADDR__, &Head, sizeof(Head));
 	DBG("reset to ota");
 	Task_DelayMS(10);
 	SystemReset();
@@ -132,8 +149,8 @@ void InFlash_Test(void)
 	Head.DataLen = 1024 * 1024;
 	Head.DataCRC32 = CRC32_Cal(CRC32_Table, __FLASH_APP_START_ADDR__ + 1024 * 1024, 1024 * 1024, 0xffffffff);
 	Head.CRC32 = CRC32_Cal(CRC32_Table, &Head.Param1, sizeof(Head) - 8, 0xffffffff);
-	Flash_EraseSector(__FLASH_OTA_INFO_ADDR__, 0);
-	Flash_ProgramData(__FLASH_OTA_INFO_ADDR__, &Head, sizeof(Head), 0);
+	Flash_Erase(__FLASH_OTA_INFO_ADDR__, __FLASH_SECTOR_SIZE__);
+	Flash_Program(__FLASH_OTA_INFO_ADDR__, &Head, sizeof(Head));
 	DBG("reset to ota");
 	Task_DelayMS(10);
 	SystemReset();

+ 27 - 5
bsp/device/src/dev_sdhc_spi.c

@@ -851,31 +851,53 @@ READ_CONFIG_ERROR:
 void SDHC_SpiReadBlocks(void *pSDHC, uint8_t *Buf, uint32_t StartLBA, uint32_t BlockNums)
 {
 	uint8_t Retry = 0;
+	uint8_t error = 1;
 	SDHC_SPICtrlStruct *Ctrl = (SDHC_SPICtrlStruct *)pSDHC;
 	Buffer_StaticInit(&Ctrl->DataBuf, Buf, BlockNums);
 SDHC_SPIREADBLOCKS_START:
 	if (SDHC_SpiCmd(Ctrl, CMD18, StartLBA + Ctrl->DataBuf.Pos, 0))
 	{
-		goto SDHC_SPIREADBLOCKS_ERROR;
+		goto SDHC_SPIREADBLOCKS_CHECK;
 	}
 	if (SDHC_SpiReadBlockData(Ctrl))
 	{
-		goto SDHC_SPIREADBLOCKS_ERROR;
+		goto SDHC_SPIREADBLOCKS_CHECK;
 	}
-	if (SDHC_SpiCmd(Ctrl, CMD12, 0, 1))
+	for (int i = 0; i < 3; i++)
 	{
-		goto SDHC_SPIREADBLOCKS_ERROR;
+		if (!SDHC_SpiCmd(Ctrl, CMD12, 0, 1))
+		{
+			error = 0;
+			break;
+		}
+		else
+		{
+			Ctrl->SDHCError = 0;
+			Ctrl->IsInitDone = 1;
+			Ctrl->SDHCState = 0;
+		}
+	}
+SDHC_SPIREADBLOCKS_CHECK:
+	if (error)
+	{
+		DBG("%x,%u,%u",Ctrl->SDHCState, Ctrl->DataBuf.Pos, Ctrl->DataBuf.MaxLen);
 	}
 	if (Ctrl->DataBuf.Pos != Ctrl->DataBuf.MaxLen)
 	{
 		Retry++;
-		DBG("%d", Retry);
+		DBG("%d,%u,%u", Retry, Ctrl->DataBuf.Pos, Ctrl->DataBuf.MaxLen);
 		if (Retry > 3)
 		{
 
 			Ctrl->SDHCError = 1;
 			goto SDHC_SPIREADBLOCKS_ERROR;
 		}
+		else
+		{
+			Ctrl->SDHCError = 0;
+			Ctrl->IsInitDone = 1;
+			Ctrl->SDHCState = 0;
+		}
 		goto SDHC_SPIREADBLOCKS_START;
 	}
 	return;

+ 2 - 0
xmake.lua

@@ -303,6 +303,8 @@ if with_luatos then
     add_includedirs(luatos.."components/gtfont",{public = true})
     add_files(luatos.."components/gtfont/*.c")
 
+    add_files(luatos.."components/i2c-tools/*.c")
+    add_includedirs(luatos.."components/i2c-tools")
     
     add_files(luatos.."components/flashdb/src/*.c")
     add_files(luatos.."components/fal/src/*.c")