最小的转换单位是group,不同的group可以包含相同的通道,不同的转换方式
Group转换支持排队,在没有优先级的作用下,先到先处理。
Adc_Ipw_StartNormalConversion转换的始终是队列中的0元素
同一个group可以包含标准转换和精准转换
S32K344支持看门狗,一旦转换的结果不在区域内会触发中断。
ADC自检功能,支持两种自检算法(可以用一种或者两种):
1,连续采集3次参考电压,分别是bandgap ,VrefH,VrefH,这三次采集是原子操作,不允许被其他高优先级ADC转换抢占。
2,每次ADC转换完后,采集校准电压并与之前校准后电压做差,大于某个范围说明,说明需要重新校验或者ADC模块损坏。
单次转换和连续转换时序图‘
ADC的自检时机是ADC转换结束,这个是周期性,不太好用。如果转换不到指定的次数,自检算法不算完成。
Mcal库提供一个函数用于一次自检。他的工作原理是
选取一个精准通道0 ,设置为连续转换模式,通道不断转换,从而完成自检查算法。
因此这个函数是一个同步函数,无法立刻返回的。需要等待。
/* Each for loop checks the conversion of all steps in self-test S algorithm
* ForLoop(0): while (AlgS-start-1) ->S0 -> S1 -> S2 -> while (Alg-end-1) -> C0 to C11 ->
* ForLoop(1): while (AlgS-start-2) ->S0 -> S1 -> S2 -> while (Alg-end-2)
*/
for (Index = 0U; Index < 2U; Index++)
{
/* Wait until Alg S has started*/
ElapsedTicks = 0U;
while ((((*MSRAddr) & ADC_MSR_SELF_TEST_S_MASK) != ADC_MSR_SELF_TEST_S_MASK) && (ElapsedTicks < TimeoutTicks))
{
ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
}
if (ElapsedTicks >= TimeoutTicks)
{
Status = ADC_SAR_IP_STATUS_TIMEOUT;
}
if (Status == ADC_SAR_IP_STATUS_SUCCESS)
{
/* Wait until Alg S has finished*/
ElapsedTicks = 0U;
while ((((*MSRAddr) & ADC_MSR_SELF_TEST_S_MASK) == ADC_MSR_SELF_TEST_S_MASK) && (ElapsedTicks < TimeoutTicks))
{
ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
}
if (ElapsedTicks >= TimeoutTicks)
{
Status = ADC_SAR_IP_STATUS_TIMEOUT;
}
}
if (Status == ADC_SAR_IP_STATUS_TIMEOUT)
{
/* Break the loop if timeout occured in order to increase performance */
break;
}
}
实现原理:ADC转换完成后会把SELF_TEST_S 标志位设置为1,等校验算法S结束后,将标志位设为0 。当进行校验算法C时,SELF_TEST_S标志位不会改变。因此会发生瞎胡说情况
ADC一直在转换,我们并不知道校验算法处于那一步
1,假如第一次进入for循环时,此时在进行C算法,因此SELF_TEST_S为0,此时直接过第一个WHILE循环,会卡在第二个while循环,直到SELF_TEST_S为1,这意味着C算法结束了,并且一个ADC转换完了,即将进行S算发自检;第二次进入for循环时:
- 假如此时S算法没有完成,SELF_TEST_S为1,会卡在第一个while循环,直到S算法结束,SELF_TEST_S为0,此时会卡在第二个while循环,直到C算法结束并又发生一次ADC转换,退出while循环,退出for循环,这样久至少执行了一次s+c算法
- 假如此时S算法完成,SELF_TEST_S为0,会卡在第2个while循环,直到C算法结束并又发生一次ADC转换,退出while循环,退出for循环,这样久至少执行了一次s+c算法
2,假如第一次进入for循环时,此时在进行S算法,因此SELF_TEST_S为1,此时会卡在第一个WHILE循环,直到SELF_TEST_S为0,这意味着S算法结束了,此时会卡在第二个while循环,
直到C算法执行完,再次准备执行S算法;此时第二次进入循环:
- 假如此时S算法没有完成,SELF_TEST_S为1,会卡在第一个while循环,直到S算法结束,SELF_TEST_S为0,此时会卡在第二个while循环,直到C算法结束并又发生一次ADC转换,退出while循环,退出for循环,这样久至少执行了一次s+c算法
- 假如此时S算法完成,SELF_TEST_S为0,会卡在第2个while循环,直到C算法结束并又发生一次ADC转换,退出while循环,退出for循环,这样久至少执行了一次s+c算法
第一次进入for循环,必须是即将进行S算法才能进入第二次for循环。
同样,第二次进入for循环,只有再次进行S算法,才可以退出for循环。
所以Mcal库提供的自检啊哈桑农户返回时间是不一样的。