MAX32660开发流程
程序的流程没有问题了,我已经在stm32上实现了基本的功能。问题就是,意法半导体已经有cube可以直接初始化资源,而美信半导体,目前我没有发现方便的cube,所以我需要扣例程。所以这次的项目相对比较简单:将美信半导体的资源开发出来就行了。
我需要一个硬件I2c、软件SPI、一个定时器。所以只需要,初始化相关的模块,并且成功使用。就能完成项目了。
首先更具推荐引脚把I2C踢出,之后就能自由分配需要的SPI引脚了。
SPI引脚
spi引脚一共是5个引脚,用P0_0~P0_4,正好五个
第一次实验,发现引脚并没有出现电平的变化,应该市引脚的使用方式不对。后来验证的时候发现P0_0,P0_1,位串口脚,所以我只能避开这两个,向上平移了两个引脚。更换引脚之后成功点亮。
硬件I2C
因为要用到MPU6050,在开发引荐I2C的时候我发现函数输入的参数和我在stm32的函数输入参数不同,好像没有设备地址。是因为放在了别的函数里设置吗?原例程太过于复杂,以至于一时半会儿看不清楚。
在群友的点拨后,我明白了,直接将需要写的寄存器数组放在发送数据的第一个就行了。是我太死板没有想到这一点。
现在又遇到了一个新的问题:I2C时序,写操作都是正确的。唯独就是连续读写的地方有问题。问题是无法读出数据,数据为0.
用逻辑分析仪看了一下,发现是6050返回的数据全是0,这么看来应该是初始化没有成功。读取程序应该没什么问题。
但是之前初始化是没问题的,这就相当矛盾了。通讯没有问题,程序也没有问题。那问题会出在哪?I2C的读取速度太快?今天就先睡觉了,说不定明天起来就好了。
第二天,我重新仔细地看了一下代码。没看出来有什么不对的地方,而且美信的硬件I2C在逻辑分析仪中波形也算正确。我把问题锁定在mpu6050,可能是初始化有问题,网上说有可能是接触不良。但是,我在实际的检测中,并没有发现什么接触不良的地方。
到最后,发现原来是复位的时候没有延迟。之前也试过了复位延迟,结果没成功,可能是复位延迟时间不合适把。
现在有了所有的外设,接下来就是将定时器初始完成,就结束准备任务了。
定时器
源码移植非常简单,我在宏定义中额外缩小了1000倍,所以现在是以毫秒为单位。
40ms进一次中断,并且额外加一个1s的定时器来解算时间。
代码移植
上层代码移植还是非常方便的,计步器不出半个小时就弄好了,现在加入时钟,我之前也写过一个类似的,在这里加进来。
感觉不能自主修改时间实在是太low了,想加个上位机。
由于是临时增加的,所以就不临时增加文件量了。直接就在main.c中添加。
小插曲
一步小心把调试口给定义了,导致无法下载程序。还好我的运气比较好,复位后,前面有外设初始化,如果没有初始化成功,那么就会卡死在那里。我也是乘着这个空挡把新的程序烧录进去。平时情况,像这种没有boot的,哪就只能用复位引脚碰运气了。
log 2.28 - 00:10
串口通讯似乎是能够收到信息的,但是好像需要收集满512条信息才会进读反馈函数,明天起来看一下有没有空闲中断什么的。
第二天,我又重新尝试了一下,发现这个函数需要接受满size的大小才会进接收中断,也是非常鸡肋。
经过半天的调试后,我发现,每次总线空闲,就会进入UART_Handler
void UART1_IRQHandler(void)
{
printf("UART_Handler\n");
UART_Handler(MXC_UART1);
}
感觉就像是只能接收9个字符,接下来的字符都会变成空,不明白为什么。介于莫名其妙的只能接受有限字符的这个bug,我直接将上位机做了一点修改,改成两次发送,问题解决。