完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在学习无在其中的通信问题中,其中电机的 FOC,使用了一个磁编码器,as5048a 作为一个角度的反馈,wm 接口输出是正常的,通信的时候出现了研究了几天,没搞清楚问题在哪里,希望有大佬点弟
。由于 5048 一位收到的连续发送的数据都存在。第二张图是逻辑的数据发送的清除错误的命令,第四次是发送一个 后通知。可以指一下 。datasheet中还提到,发0x0000,应该收到没有0x0000,之后的测试结果。 主函数的循环: int main(void) { uint8_t tx[2]={0x00,0x00}; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 SysTick_Init(); LED_Init();//初始化LED端口 EXTI_Key_Config(); USART3_Init(500000);//与上位机通信 TIM2_Init();//系统计时,用于计算时间 SPI_Config();//采数跳变、存在问题 TIM5_Init();//用于控制电机三相信号 TIM6_Init(1000-1,84-1);//1KHz,定时器,用于多任务分频,放在所有外设初始化之后 // printf("This is a FOC program.rrn"); while(1) { //*******************系统指示灯 if(gFlag100ms==SET) { LED1_TOGGLE(); PitchAngle=Read_As5048A_Reg(0x3FFF); gFlag100ms = RESET; } } SPI配置: #include "stm32f4xx_conf.h" #include "spi.h" #include "delay.h" static __IO uint32_t SPITimeout = SPIT_LONG_TIMEOUT; void SPI_Config() { SPI_InitTypeDef spi; GPIO_InitTypeDef gpio; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOH,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE); //SPI的I/O初始化 gpio.GPIO_Pin = SPI_SCK_PIN|SPI_MISO_PIN|SPI_MOSI_PIN; gpio.GPIO_Speed = GPIO_Low_Speed; gpio.GPIO_Mode = GPIO_Mode_AF; gpio.GPIO_OType = GPIO_OType_PP; gpio.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(SPI_GPIO_PORT, &gpio); GPIO_PinAFConfig(SPI_GPIO_PORT,SPI_SCK_PINSOURCE,GPIO_AF_SPI2); GPIO_PinAFConfig(SPI_GPIO_PORT,SPI_MISO_PINSOURCE,GPIO_AF_SPI2); GPIO_PinAFConfig(SPI_GPIO_PORT,SPI_MOSI_PINSOURCE,GPIO_AF_SPI2); //片选口 gpio.GPIO_Pin = ICGCSB_PIN; gpio.GPIO_Mode = GPIO_Mode_OUT; gpio.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(ICGCSB_PORT, &gpio); GPIO_SetBits(ICGCSB_PORT,ICGCSB_PIN); //SPI1初始化 spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI通信方式:2线全双工 spi.SPI_Mode = SPI_Mode_Master;//SPI主从模式:主机模式 spi.SPI_DataSize = SPI_DataSize_16b; spi.SPI_CPOL = SPI_CPOL_Low;//时钟极性:CPOL=0:串行同步时钟的空闲状态为低电平 spi.SPI_CPHA = SPI_CPHA_2Edge;//时钟相位:CPHA=1:串行同步时钟的第二个跳变沿(上升或下降)数据被采样 spi.SPI_NSS = SPI_NSS_Soft;//软件NSS SPI_NSS_Soft SPI_NSS_Hard spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;//预分频系数 fSCK = 42MHz/SPI_BaudRatePrescaler spi.SPI_FirstBit = SPI_FirstBit_MSB;//传输顺序:高位在前 spi.SPI_CRCPolynomial = 15;//CRC值计算的多项式 SPI_Init(SPI2, &spi); SPI_Cmd(SPI2, ENABLE);//使能SPI delay_ms(10); } /** * @brief 使用SPI发送2个字节的数据 * @param Halfword:要发送的数据 * @retval 返回接收到的数据 */ uint16_t SPI_SendHalfWord(uint16_t HalfWord) { GPIO_ResetBits(GPIOB, GPIO_Pin_12); delay_us(1); SPI_I2S_SendData(SPI2, HalfWord); while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); GPIO_SetBits(GPIOB, GPIO_Pin_12); return SPI_I2S_ReceiveData(SPI2); } /** * @brief 等待超时回调函数 * @param None. * @retval None. */ uint16_t SPI_TIMEOUT_UserCallback(uint8_t errorCode) { /* 等待超时后的处理,输出错误信息 */ // SPI_ERROR("SPI 等待超时!errorCode = %d",errorCode); return 0; } 收发校验等部分: // Calculates even parity of 16it value, returns 1 (odd) or 0 (even) uint8_t parity_even(uint16_t v) { if(v == 0) return 0; v ^= v >> 8; v ^= v >> 4; v ^= v >> 2; v ^= v >> 1; return v & 1; //return v ^ 1; } uint8_t error_flag; uint16_t Read_As5048A_Reg(uint16_t cmd) { uint16_t data = 0; uint16_t res; uint16_t command = 0x4000;// PAR=0 R/W=R command = command | cmd; command |= ((uint16_t)parity_even(command)<<15);//Add a parity bit on the the MSB SPI_SendHalfWord(command); delay_us(2); res = SPI_SendHalfWord(command); delay_us(2); error_flag = 0; if ((res&0x4000) == 0)// |
|
|
|
只有小组成员才能发言,加入小组>>
3322 浏览 9 评论
3000 浏览 16 评论
3497 浏览 1 评论
9070 浏览 16 评论
4090 浏览 18 评论
1190浏览 3评论
613浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
603浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2341浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1899浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 12:06 , Processed in 1.314883 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号