刚入职时做项目用到了PIC这款单片机,国内资料比较少。说实话我最怕写硬件底层驱动,说起来惭愧学生时期只自己尝试对着手册写过iic的,spi还是头一次使用,调用方法从国外论坛查到的。
花了2天的时间才读出数据,然后使用485传输。
我直接使用了MCC对芯片引脚及外设进行了配置。
如果有什么不对的地方欢迎大家指出改正。
系统使用的内部振荡器
PIC的SPI四种模式,和标准有些区别
根据芯片手册中的时序图,选择SPI的模式一。MCU作为主机。
当时我debug观察变量,发现数据稳定是稳定了,但是会发生2倍跳变,然后再稳定,这样肯定不对。
于是我使用了模拟IO方法,读出了稳定的值,再慢慢更改模式,最终发现是在采样输入数据配置中出了问题,是选择“END”而不是中间。
配置完后给IO口重命名,查看输入输出的配置是否正确。
中断这里也要勾上。我没有注意到要打开中断外设使能,导致串口中断不能使用。
在刚创建好工程那会我翻开了下代码,唯独没有注意头文件藏着封装好的函数。
#include "interrupt_manager.h"
在主函数中系统初始化后加入:
void main(void)
{
SYSTEM_Initialize();
INTERRUPT_GlobalInterruptEnable();
INTERRUPT_PeripheralInterruptEnable();
spi_master_open(MASTER1);
while (1)
{
Send485();
dat=Read_Angle();
Angle=(dat>>4)*0.00879*10; //y = 11.375x + 0.1667
// dat=Sim_Angle_Dout();
// Angle=dat*0.00879*10;
}
}
AS5045B.c
我只需要读出高12位的值即可,后面的校验位等信息暂时不用关心。后面的OTP编程模式看起来很复杂,我也没有去了解。
#include "AS5045B.h"
#include "mcc.h"
/*******硬件SPI*********/
uint16_t Read_Angle()
{
uint8_t dat1,dat2;
uint16_t a;
SPI_CS_SetLow();
// DELAY_milliseconds(1);
// RC0_SetHigh();
DELAY_milliseconds(1);
dat1= SPI_ExchangeByte(0);
dat2= SPI_ExchangeByte(0);
SPI_CS_SetHigh();
DELAY_milliseconds(1);
// RC0_SetHigh();
a=(uint16_t)((dat1<<8)|dat2);
return a;
}
/********IO模拟SPI*********/
uint16_t Sim_Angle_Dout()
{
uint16_t out;
uint8_t i;
out=0;
SPI_CS_SetHigh();
RC0_SetHigh();
SPI_CS_SetLow(); //数据输出DO从变为高电平并启动读取操作
DELAY_microseconds(2);
RC0_SetLow(); //数据在CLK第一个下降沿锁存至输出移位寄存器中
DELAY_microseconds(2);
for(i=0;i<12;i++) //循环取高12位角度信息
{
out=out<<1;
RC0_SetHigh();
//每个CLK上升沿移出一位数据
DELAY_microseconds(2);
out|=RC1_GetValue();
DELAY_microseconds(2);
RC0_SetLow();
DELAY_microseconds(2);
}
DELAY_microseconds(2);
SPI_CS_SetHigh();
RC0_SetHigh();
DELAY_microseconds(1);
return (out);
}
由于SPI是全双工通信,发的时候会接收到数据,所以接数据且不需要发送数据时候写个0就可以了
时钟极性(CPOL)定义了时钟空闲状态电平:
CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时
时钟相位(CPHA)定义数据的采集时间:
CPHA=0,在时钟的第一个跳变沿进行数据采样,在第2个边沿发送数据
CPHA=1,在时钟的第二个跳变沿进行数据采样,在第1个边沿发送数据
例如:CPOL=0,CPHA=0时,CPOL为0是空闲;
CPHA=0要在第一个边沿进行数据采样,所以CLK由低到高,数据采样在上升沿,发送在下降沿(第2个边沿)
CPOL=0,CPHA=1时,CPOL为0是空闲;
CPHA=0要在第二个边沿进行数据采样,所以CLK由高到低,数据采样在下降沿,发送在上升沿(第1个边沿)
简要记录自己学习的过程。感觉Debug不能随时查看变量数值很麻烦,必须要单步执行暂停。
软件会时常出现莫名其妙的毛病,例如编译不了makefile文件出错,重启解决。下载调试过程也是,后来莫名其妙就好了,我以为下载器寄了。
我还需继续努力,学习更多技术,提升自身能力。往后会陆续更新自己以前写过的部分东西。