前言
参加创新“芯”引擎 | 国民技术N32G457 RT-Thread设计大赛,使用到了spi但是呢,spi接口使用rtt的还是头一次,所以呢还是学习。
在使用spi的时候使用RT-Thread Studio开发板创建的模板工程有部分问题,没有drv_spi文件。使用spi不会啊,整半天整不出来询问大佬吧,大佬说没有文件啊,接口函数没办法给到芯片啊,然后大佬大手一挥给了我一个drv_spi.c/.h文件,改吧!
奈何小弟才疏学浅的。刚开始弄,是真的不会啊。在群里也问了问群友啥的说在gitup上面有,发给了我一个链接,下载下来后添加进去,好了既然是弄好的,开始弄吧,结果天不随人愿,果然不出所料第一次一点反应也没有示波器抓,看着直直的波形发呆。
好吧不行,大佬说看看寄存器实现了吗,但是Studio咋看不知道啊,算了先弄n32的裸机吧,因为使用keil比较熟练的缘故,毫无疑问,示波器一抓,跑的嗖嗖的。好了毕竟是参加的RT-Thread设计大赛,尽量调用RT-Thread的的函数实现。
经过不懈的努力成了,但是波形好丑奥,都快成正弦波了,一看时钟18M不大啊,调小了弄弄吧,enn结果咋调调不对,一看我赛,里面分频固定死了4分频。哎无奈改吧。最后还是逃脱不了改的命运。
实现spi接口
因为自己刚毕业,对各种东西的理解不是很深,感谢大佬(出出啊)的帮助,因为我使用的事spi1,我控一个dac芯片所以只需要发送即可如果有需要读取,在n32的库的时候配置miso接口实现即可,使用RT-Thread可以调用函数来实现。
(一、)使用n32的库实现spi
void spi_init()
{
GPIO_InitType GPIO_InitCtlStruct;
SPI_InitType SPI_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_SPI1, ENABLE);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
GPIO_InitCtlStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitCtlStruct.Pin = GPIO_PIN_5 | GPIO_PIN_7;
GPIO_InitCtlStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOA, &GPIO_InitCtlStruct);
SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;//全双工
SPI_InitStructure.SpiMode = SPI_MODE_MASTER; //主spi
SPI_InitStructure.DataLen = SPI_DATA_SIZE_16BITS; //SPI 16位数据
SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_8; //16分频
SPI_InitStructure.CLKPOL = SPI_CLKPOL_LOW; //时钟极性
SPI_InitStructure.CLKPHA = SPI_CLKPHA_FIRST_EDGE; //初始时钟极性
SPI_InitStructure.FirstBit = SPI_FB_MSB; //指定数据传输从MSB位
SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE; //SPI_时钟_相位
SPI_InitStructure.NSS = SPI_NSS_SOFT;
SPI_InitStructure.CRCPoly = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Enable(SPI1, ENABLE);
}
void spi_write_(uint16_t data)
{
while (SPI_I2S_GetStatus(SPI1, SPI_I2S_TE_FLAG) == RESET);
SPI_I2S_TransmitData(SPI1, data);
}
(二)、使用rtt的接口实现
使用rtt的接口实现,我是参考api手册实现的,在这期间也弄了不少时间,学习了不少东西也。
一开始没有drv_spi文件经过群里伙伴(大佬)的指导,给链接啊,找到了文件。
但是在使用时发现始终时钟为4分频,经过自己的修改,修改为半可调的因为是调用的n32的库所以,进行分频的调节频率。如果有需要的小伙伴可以下载使用。
原代码:
修改后:
#define SPI "spi1"//使用spi1接口
#define SPI_DA "spi10"//将设备配置成spi1的第0个设备
void spi_init(void)
{
rt_hw_spi_device_attach(SPI,SPI_DA,GPIOC,4);//将da挂载到SPI设备上
/* 查找 spi 设备获取设备句柄 */
spi_da = (struct rt_spi_device *)rt_device_find(SPI_DA);
if (spi_da == RT_NULL)
{
rt_kprintf("spi sample run failed! can't find %s device!\n", SPI);
}
else {
struct rt_spi_configuration spi_config;
spi_config.data_width = 16;
spi_config.max_hz = 10 * 1000 * 1000;
spi_config.mode = RT_SPI_MASTER | RT_SPI_MODE_0| RT_SPI_MSB;
rt_spi_configure(spi_da, &spi_config);
}
rt_pin_mode(LOAC, PIN_MODE_OUTPUT);
rt_pin_write(LOAC,PIN_HIGH);
}
void spi_send(uint16_t data)
{
rt_spi_transfer (spi_da, data, RT_NULL, 1);
rt_pin_write(LOAC,PIN_HIGH);
rt_hw_us_delay(2);
rt_pin_write(LOAC,PIN_HIGH);
}
注:rtt的spi只有2个n32支持3个spi接口,将第三个接口初始化后,在组件那不会用啊。
原作者:嚜軒公告