一些背景:
我使用STM32接收和传输一个24位的长信号,该信号可以确定电池是过度放电还是过度充电,并通过AFE监测温度。
实际问题:
我需要在其中一个STM库中使用的函数采用一个8位指针的参数:HAL_SPI_Transmit(&hspi1, (uint8_t *)&buf_ptr, 1, 100);
,以便与24位AFE接口。我的目标是编写一个32位信号,可以对我需要的数据进行编码,只需调用函数3次,并用8位指针引用32位信号。但我想知道解决我的问题最简单的方法是什么
我的第一个希望是,我可以用一个8位指针访问信息的第一个字节,然后每次将地址增加一个:
void MAX_Interface::MOSI_BufTransmit()
{
uint8_t* buf_ptr = (uint8_t) &OBuf;
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_RESET);
for (int i = 0; i < 3; i++)
{
HAL_SPI_Transmit(&hspi1, (uint8_t *)&buf_ptr, 1, 100);
buf_ptr++;
}
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_SET);
}
我的第二个想法是,也许我可以每次将输出缓冲区位移8位,然后将其转换为一个字节:
void MAX_Interface::MOSI_BufTransmit()
{
uint8_t* buf_ptr
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_RESET);
for (int i = 0; i < 3; i++)
{
buf_ptr =(uint8_t*) OBuf>>8*i;
HAL_SPI_Transmit(&hspi1, (uint8_t *)&buf_ptr, 1, 100);
}
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_SET);
}
我觉得这些可能是最优雅的解决方案,但都不起作用。
有人更了解这个话题吗?
访问32位整数的单个字节是可以的。
但是,由于将错误的内存地址传递给HAL_SPI_Transmit()
,这两种方法都无法工作。您传递的是buf_ptr
本身的地址,而不是buf_ptr
所指向的OBuf
的地址。
此外,在第二种方法的情况下,您甚至没有将buf_ptr
指定为指向一个有效的内存地址!您正在读取OBuf
各个字节的值,并将它们强制转换为指针,而不是获取每个字节的地址。
试试这个:
void MAX_Interface::MOSI_BufTransmit()
{
uint8_t* buf_ptr = (uint8_t*) &OBuf;
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_RESET);
for (int i = 0; i < 3; ++i)
{
HAL_SPI_Transmit(&hspi1, buf_ptr+i, 1, 100); // or: &buf_ptr[i]
}
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_SET);
}
也就是说,HAL_SPI_Transmit()
的第三个参数是字节计数,所以你可以试着简单地要求HAL_SPI_Transmit()
一次性发送所有3个字节,而不是每次调用HAL_SPI_Transmit()
3次发送1个字节,例如:
void MAX_Interface::MOSI_BufTransmit()
{
uint8_t* buf_ptr = (uint8_t*) &OBuf;
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, buf_ptr, 3, 100);
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_SET);
}