如何解决STM32从数字SPC读取数据并通过I2C同时通信
我正在开发一个在 STM32 上运行的应用程序,其目的是从 digimatic spc 协议(mitutoyo 设备)读取数据,然后通过 I2C 总线将数据发送到树莓派。树莓派是 I2C 总线上的主机,STM32 是从机。
STM32一个周期从digimatic协议中读取数据。 STM32 中的 I2C 通过中断运行。所以当STM32中的树莓派发出请求时,会立即触发中断并提供服务。问题是从数显读取数据被中断,程序一回到中断前中断的地方,就可以读取坏数据。
有没有人解决过类似的问题?
这是读取数据的代码
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_TIM2_Init();
HAL_I2C_EnableListen_IT(&hi2c1);
while (1)
{
//reading data
RQST_LOW();
HAL_Delay(5);
RQST_HIGH();
uint32_t timeout=200;
time=0;
TIM2->CNT=0;
HAL_TIM_Base_Start_IT(&htim2);
for(uint8_t i = 0; i < 13; i++ )
{
uint8_t k=0;
for (uint8_t j = 0; j < 4; j++)
{
while(HAL_GPIO_ReadPin(DG_CLK_GPIO_Port,DG_CLK_Pin) == false && timeout>time)
{
time=(uint32_t)TIM2->CNT;
}
while( HAL_GPIO_ReadPin(DG_CLK_GPIO_Port,DG_CLK_Pin) == true && timeout>time)
{
time=(uint32_t)TIM2->CNT;
}
bitWrite(k,j,(HAL_GPIO_ReadPin(DG_DATA_GPIO_Port,DG_DATA_Pin) & 0x1));
}
rawdata[i] = k;
}
if(!(timeout>time))
{
aTxBuffer[0]=' ';
aTxBuffer[1]=' ';
aTxBuffer[2]=' ';
aTxBuffer[3]=' ';
aTxBuffer[4]=' ';
aTxBuffer[5]=' ';
aTxBuffer[6]=' ';
aTxBuffer[7]=' ';
}
else
{
HAL_TIM_Base_Stop_IT(&htim2);
char buf[7];
for(int lp=0;lp<6;lp++)
{
buf[lp]=rawdata[lp+5]+'0';
}
uint64_t cur_value_int =atoi(buf);
char buf_dec[2];
buf_dec[0] = rawdata[11]+'0';
decimal = atoi(buf_dec);
float cur_value = (float)cur_value_int*(float)pow(10,-decimal);
char buf_sign[2];
buf_sign[0] = rawdata[4]+'0';
int32_t temp = atoi(buf_sign);
if(rawdata[4]==8)
{
cur_value = -cur_value;
}
char buf_unit[2];
buf_unit[0] = rawdata[12]+'0';
temp = atol(buf_unit);
units = (bool)temp;
RQST_LOW();
HAL_Delay(50);
float nearest = roundf(cur_value * 100) / 100;
char array[8] = {0};
sprintf(aTxBuffer,"%.2f",nearest);
}
HAL_Delay(300);
}
}
这里是 I2C 中断处理程序代码
void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c,uint8_t TransferDirection,uint16_t AddrMatchCode)
{
UNUSED(AddrMatchCode);
if(hi2c->Instance==I2C1)
{
if(TransferDirection == TRANSFER_DIR_READ)
{
if(HAL_I2C_Slave_Seq_Receive_IT(&hi2c1,(uint8_t *)aRxBuffer,RXBUFFERSIZE,I2C_NEXT_FRAME)!=HAL_OK)
{
Error_Handler();
}
}
else
{
HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1,(uint8_t*)aTxBuffer,8,I2C_LAST_FRAME);
}
}
}
void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
{
HAL_I2C_EnableListen_IT(&hi2c1); // Restart
}
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *I2cHandle)
{
if (HAL_I2C_GetError(I2cHandle) != HAL_I2C_ERROR_AF)
{
Error_Handler();
}
}
我很乐意为您提供任何建议
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。