STM32F103 CubeMX 使用IIC 控制 AS5600芯片读取角度信息
cubmx 代码生成
基本上配置情况就如图所示,时钟配置成了72M
代码
串口重定向
将串口的代码重新使用了printf来输出,
将串口的printf,转换成了hex来输出
#include <stdio.h>
//重定向c库函数printf到串口USARTx,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口USARTx */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return (ch);
}
void ShowHex(uint8_t *buf,uint8_t len)
{
uint8_t i;
printf("hex = ");
for( i = 0; i < len; i++){
printf(" %02X",buf[i]); //使用前导0补齐
//printf(" %2X",buf[i]); //使用前导空格补齐
//printf(" %X",buf[i]); //输出最短的16进制格式
}
printf( "\r\n");
}
主程序的部分
读取数据基本上就按照这个时序来实现,主要测试的时候需要有一个逻辑分析仪,看一下收发的数据是不是符合期望,
像博主就将数据没有发对,浪费了很长的时间。所以在调试的时候,需要做好相关的观测,还是十分重要的。
对特定地址写数据,就是下面的框图,
这个是芯片内部的寄存器列表,以及对应的功能。
这里设备的7bit地址是:0x36,发送的数据有补上第八位
0x0c 是读数据的起始地址
I2C_MEMADD_SIZE_8BIT :单个的位数,有16和8两个,这个取决于设备的位数,常见的都是8位
I2C_Buffer_Read :是一个数组的地址,也是C中的指针地址,函数会将这个地址给到相关的值。
4:一次读取的位数
50:表示等待的延时,通讯不稳定的时候会有影响。
后面的jiaodu就是将读取到的数据,进行计算,得到相关的角度信息。
while (1)
{
uint16_t jiaodu = 0;
uint8_t I2C_Buffer_Read[4] ={0};
HAL_I2C_Mem_Read(&hi2c1, 0x6c,0x0C,I2C_MEMADD_SIZE_8BIT,I2C_Buffer_Read,4,50);
//12位的数据处理成 角度数据
jiaodu = I2C_Buffer_Read[0] << 8;
jiaodu = jiaodu | I2C_Buffer_Read[1];
jiaodu = jiaodu * 0.08789;
printf("%u,",jiaodu);
// ShowHex(I2C_Buffer_Read,4);
HAL_Delay(50);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
磁铁的注意事项
不知道是我磁铁的问题,还是芯片的问题,
平行放置磁铁的时候读取的角度比较乱,需要将磁铁竖在下面,才能正常读取到磁铁的信息
就很奇怪,也不能理解