STM32驱动ADC124S051(HAL库)源码——升级版

  • MCU型号:stm32f103c8t6;
  • ADC信号:ADC124S051,12bit;
  • 提供的示例代码是读取3个通道的数据;
  • 我使用这颗芯片时遇到的问题:只读取一个通道没问题。如果连续读取>=2个通道的话,通道数据会错开。比如代码里写的是读取A通道,但实际上是B通道数据。如果是4通道连续读取的话,好像是A读的是B,B读的C,C读的D,D读的是A,就类似这样错开。
  • 代码写完后我会实际读取数据调试一下,把错位的数据纠正过来。
  • 以下是源码:
  • HAL库方式,SPI的“DATASIZE”配置成16bit,这就有一个问题,HAL库里的SPI操作函数HAL_SPI_TransmitReceive()的形参类型都是“uint8_t”,但是SPI配置的字节长度是16bit,这怎么办?
  • 两种方法,一是直接修改HAL库封装函数,把形参类型改成uint16_t,改来改去自己都糊涂了,尽量不要动封装源码,此法不建议;
    二是强制转换类型,虽然形参传递是按照uint8_t来传,但是SPI函数最终给到你的还是完整的uint16_t类型的数据
  • 变量要定义成数组形式
uint16_t channel1[1] = {
     0x0000 };	 //注意数据类型都是uint16_t
uint16_t channel2[1] = {
     0x0800 };
uint16_t channel3[1] = {
     0x1000};
uint16_t channel4[1] = {
     0x1800};
uint16_t x_index[1] = {
      0 };	//用来存放SPI读取到的数据
uint16_t x_cos[1] = {
      0 };
uint16_t x_sin[1] = {
      0 };
void Data_collection()
{
     	
    ......
	//--------------------------
	reg_CS1 = 0;
	HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)&channel3, (uint8_t*)x_index, 1, 0xff);  	//强制类型转换(uint8_t*),这个函数最终返回给你的x_index还是完整的uint16_t类型的数据。
	HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)&channel4, (uint8_t*)x_cos, 1, 0xff);     
	HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)&channel1, (uint8_t*)x_sin, 1, 0xff); 	
	reg_CS1 = 1;
	......
	/*利用读到的数据x_index、x_cos、x_sin做一些事情*/
}

你可能感兴趣的:(嵌入式,stm32HAL库SPI,ADC124S051,SPI数据长度配置16bit,ADC采集数据,数据类型转换)