【前言】
MAX32630这款MCUSPI的使用的文章非常少,而官方的示例也是使用了SPIM1跟SPIM0,而我需要使用SPIM2,他们的配置又与其他的两个不同,为此配置与调试历经了许多的问题,最后还是调好了,为此记录如下:
【硬件】
1、MAX32630FTHR开发板
2、逻辑分析仪
【调试步骤】
1、首先找到原理图,确定IO,我这里只能使用SPIM2这组外设,CS选用SSEL
2、参考mx25的初始化配置:
// Initialize the SPIM spim_cfg_t cfg; cfg.mode = 0; cfg.ssel_pol = 0; cfg.baud = MX25_BAUD; sys_cfg_spim_t sys_cfg; // MX25 IO Config core I/O, ss0, ss1, ss2, quad, fast I/O sys_cfg.io_cfg = (ioman_cfg_t)IOMAN_SPIM1(1, 1, 0, 0, 1, 1); sys_cfg.clk_scale = CLKMAN_SCALE_AUTO; if((error = SPIM_Init(MXC_SPIM1, &cfg, &sys_cfg)) != E_NO_ERROR) { printf("Error initializing SPIM %d\n", error); while(1) {} } else { printf("SPIM Initialized\n"); }
但是我找到IOMAN_SPIM2他的传与参数与SPIM1的又不相同:
因此就不参观照SPIM1的来设置了。
在用户手册中我找到了IOMAN_SPIM2的参数说明:
在与SPIM两者之间主要存在有SPIM2的GPIO有重映射来定位管脚,即SPIM2的第一个参数m是可以有0,1,2来映射对应的管脚,从我们的原理图上看,应该要映射到MappingB组中。因此m为1
SR我们没有用到,因也可以不用配置。
经过确认后,我配置参数如下:
// Initialize the SPIM spim_cfg_t cfg; cfg.mode = 0; cfg.ssel_pol = SPIM_SSEL0_LOW; cfg.baud = SSD1361_BAUD; static spim_req_t req; sys_cfg_spim_t sys_cfg; // SSD1361 IO Config Map core I/O, ss0, ss1, ss2, sr0 sr1 quad, fast I/O // MAPB P5_3 sys_cfg.io_cfg = (ioman_cfg_t)IOMAN_SPIM2(1, 1, 1, 0, 0, 0, 0, 0, 1); sys_cfg.clk_scale = CLKMAN_SCALE_AUTO; if((error = SPIM_Init(MXC_SPIM2, &cfg, &sys_cfg)) != E_NO_ERROR) { printf("Error initializing SPIM %d\n", error); while(1) {} } else { printf("SPIM Initialized\n"); }
3、发送数据测试
uint8_t buf[3] = {0xee,0xaa,0x11}; req.ssel = 0; req.len = 3; req.tx_data = buf; req.rx_data = NULL; req.width = SPIM_WIDTH_1; req.deass = 0; SPIM_Trans(MXC_SPIM2, &req);
但是我发送出来的数据用逻辑分析仪观察即不是我想要的结果:
发现SCK的时序是乱的。
【原因查找】
经用示波器观察,他的电压明显不足,高电压只有1.8V,我使用1.8V来解析,就可以正确的识别:
我需要使用的SPI是用来驱动LCD屏的,他的电压为3.3V因此需要将MAX32630的IO输出设置为3.3V
【解决方法】
MAX32630有一个函数为SYS_IOMAN_UseVDDIOH,是用来设置IO的电压输出值的,加入代码如下:
const gpio_cfg_t ssd1361_spi = { PORT_5, (PIN_0 | PIN_1 | PIN_3), GPIO_FUNC_GPIO, GPIO_PAD_NORMAL }; SYS_IOMAN_UseVDDIOH(&ssd1361_spi);
重新更新固件后就可以正确识别了:
【总结】
由于max32630这款芯片比较老,在国内使用的人非常少,资料也很难找到,今天用了大约半天,终于把SPI的时序给调出来了。特此记录。