[Arduino资料]

MT6826S磁编码器Arduino分享

[复制链接]
1123|1
手机看帖
扫描二维码
随时随地手机跟帖
rickluo|  楼主 | 2024-5-21 14:17 | 显示全部楼层
MT6826S &PT32L007 SPI通讯源代码分享:

#include "PT32x007x.h"
#include "spi_flash.h"

uint8_t ReadMT6835(uint16_t add);

/* USER CODE BEGIN PV */
#define READANGLECOMMAND 0xA000
#define READCOMMAND 0x3000
#define WRITECOMMAND 0x6000         
#define TOEEPROMCOMMAND 0xC000
#define WRITEZEROCOMMAND 0x5000         

#define CSN_Low()  GPIO_ResetBits(GPIOA, GPIO_Pin_3);  //CSN LOW
#define CSN_High() GPIO_SetBits(GPIOA, GPIO_Pin_3);    //CSN HIGHT

#define RBUFFSIZE 10
uint16_t RBuf[RBUFFSIZE]={1,2,3,4,5,6,7,8,9,10};
unsigned int Angle = 0;
uint32_t AngleIn21bits = 0;
uint8_t Spi_TxData[4]={0x83,0xff,0xff,0xff};///////03 04 05 寄存器存角度
uint8_t Spi_pRxData[4]={0};
//crc8 table X8+X2+X+1
uint8_t Crc8Table[256]=
{
0x0,0x7,0xe,0x9,0x1c,0x1b,0x12,0x15,0x38,0x3f,0x36,0x31,0x24,0x23,0x2a,0x2d,
0x70,0x77,0x7e,0x79,0x6c,0x6b,0x62,0x65,0x48,0x4f,0x46,0x41,0x54,0x53,0x5a,0x5d,
0xe0,0xe7,0xee,0xe9,0xfc,0xfb,0xf2,0xf5,0xd8,0xdf,0xd6,0xd1,0xc4,0xc3,0xca,0xcd,
0x90,0x97,0x9e,0x99,0x8c,0x8b,0x82,0x85,0xa8,0xaf,0xa6,0xa1,0xb4,0xb3,0xba,0xbd,
0xc7,0xc0,0xc9,0xce,0xdb,0xdc,0xd5,0xd2,0xff,0xf8,0xf1,0xf6,0xe3,0xe4,0xed,0xea,
0xb7,0xb0,0xb9,0xbe,0xab,0xac,0xa5,0xa2,0x8f,0x88,0x81,0x86,0x93,0x94,0x9d,0x9a,
0x27,0x20,0x29,0x2e,0x3b,0x3c,0x35,0x32,0x1f,0x18,0x11,0x16,0x3,0x4,0xd,0xa,
0x57,0x50,0x59,0x5e,0x4b,0x4c,0x45,0x42,0x6f,0x68,0x61,0x66,0x73,0x74,0x7d,0x7a,
0x89,0x8e,0x87,0x80,0x95,0x92,0x9b,0x9c,0xb1,0xb6,0xbf,0xb8,0xad,0xaa,0xa3,0xa4,
0xf9,0xfe,0xf7,0xf0,0xe5,0xe2,0xeb,0xec,0xc1,0xc6,0xcf,0xc8,0xdd,0xda,0xd3,0xd4,
0x69,0x6e,0x67,0x60,0x75,0x72,0x7b,0x7c,0x51,0x56,0x5f,0x58,0x4d,0x4a,0x43,0x44,
0x19,0x1e,0x17,0x10,0x5,0x2,0xb,0xc,0x21,0x26,0x2f,0x28,0x3d,0x3a,0x33,0x34,
0x4e,0x49,0x40,0x47,0x52,0x55,0x5c,0x5b,0x76,0x71,0x78,0x7f,0x6a,0x6d,0x64,0x63,
0x3e,0x39,0x30,0x37,0x22,0x25,0x2c,0x2b,0x6,0x1,0x8,0xf,0x1a,0x1d,0x14,0x13,
0xae,0xa9,0xa0,0xa7,0xb2,0xb5,0xbc,0xbb,0x96,0x91,0x98,0x9f,0x8a,0x8d,0x84,0x83,
0xde,0xd9,0xd0,0xd7,0xc2,0xc5,0xcc,0xcb,0xe6,0xe1,0xe8,0xef,0xfa,0xfd,0xf4,0xf3,
};
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
//static void MX_GPIO_Init(void);
//static void MX_SPI1_Init(void);
//static void MX_USART1_UART_Init(void);


void Software_Delay(void)//延时函数
{
        u8 i, j,x;
        for(i=0; i<100; i++)
                for(j=0; j<200; j++)
                        for(x=0; x<200; x++);
}

/*******************************************************************************
*Function:        UART_GPIO_Config
*Description:        配置UART引脚
*Input:                无
*Return:                无

*Others:
                        该函数负责使能UART模块相关引脚
*******************************************************************************/
void UART_GPIO_Config(void)
{
        /* 配置UART管脚的复用功能 */
        GPIO_DigitalRemapConfig(AFIOD, GPIO_Pin_5, AFIO_AF_0,ENABLE);        //PD5 TX0
        GPIO_DigitalRemapConfig(AFIOD, GPIO_Pin_6, AFIO_AF_0,ENABLE);        //PD6 RX0
}

/*******************************************************************************
*Function:        UART_Mode_Config
*Description:        配置UART
*Input:                无
*Return:                无
*Others:
                        该函数负责初始化UART模块的工作及其工作方式
*******************************************************************************/
void UART_Mode_Config(void)
{
        UART_InitTypeDef  UART_InitStruct;

        /*初始化UART0*/
        UART_InitStruct.UART_BaudRate = 9600;
        UART_InitStruct.UART_WordLengthAndParity=UART_WordLengthAndParity_8D;
        UART_InitStruct.UART_StopBitLength=UART_StopBitLength_1;
        UART_InitStruct.UART_ParityMode=UART_ParityMode_Odd;
        UART_InitStruct.UART_Receiver=UART_Receiver_Enable;
        UART_InitStruct.UART_LoopbackMode=UART_LoopbackMode_Disable;
        UART_Init(UART0, &UART_InitStruct);

        /*开启UART0的收发功能*/
        UART_Cmd(UART0, ENABLE);
}


/*
初始化SPI管脚
*/

void SPI_GPIO_Config(void)
{
        GPIO_DigitalRemapConfig(AFIOA, GPIO_Pin_3, AFIO_AF_1,ENABLE);        //SPI_CS数字功能复用
        GPIO_DigitalRemapConfig(AFIOC, GPIO_Pin_5, AFIO_AF_1,ENABLE);        //SPI_SCK数字功能复用
        GPIO_DigitalRemapConfig(AFIOC, GPIO_Pin_6, AFIO_AF_1,ENABLE);        //SPI_MOSI数字功能复用
        GPIO_DigitalRemapConfig(AFIOC, GPIO_Pin_7, AFIO_AF_1,ENABLE);        //SPI_MISO数字功能复用
}

void FLASH_Init(SPI_TypeDef* SPIx)
{
  SPI_InitTypeDef SPI_InitStruct;
        /*--------------- Reset SPI init structure parameters values -----------------*/
        /* Initialize the SPI_Mode member */
        SPI_InitStruct.SPI_MasterSlaveMode = SPI_MasterSlaveMode_Master;
        /* Initialize the SPI_DataSize member */
        SPI_InitStruct.SPI_DataFrameFormat = SPI_DataFrameFormat_8b;
        /* Initialize the SPI_CPOL member */
        SPI_InitStruct.SPI_ClockPolarity = SPI_ClockPolarity_Low;
        /* Initialize the SPI_CPHA member */
        SPI_InitStruct.SPI_ClockPhase = SPI_ClockPhase_1Edge;
        /* Initialize the SPI_CSS member */
        SPI_InitStruct.SPI_CSS = SPI_CSS_SoftwareControl;
  /* Initialize the SPI_SWCS member */
        SPI_InitStruct.SPI_SoftwareControlCSS = SPI_SoftwareControlCSS_High;
        /* Initialize the SPI_Prescaler member */
        SPI_InitStruct.SPI_Prescaler = 2;
        /* Initialize the SPI_BaudRatePrescaler member */
        SPI_InitStruct.SPI_BaudRate = 20;

        SPI_Init(SPI,&SPI_InitStruct);
        SPI_Cmd(SPI,ENABLE);
}


void ReadAngle(SPI_TypeDef* SPIx)
{
        uint32_t register03 = 0,register04 = 0,register05 = 0,register06 = 0, angle = 0;
        uint8_t pTxData[3]={0,0,0},pRxData[3]={0,0,0};
       
        uint16_t reg_addr = 0 ;
        //读角度必须只能给一个下降沿,如果给三个就得到三个不同的时刻的角度
       
        SPI_SoftwareControlCSSConfig(SPIx,SPI_SoftwareControlCSS_Low);

        //0x03
        reg_addr = 0x03 ;
        reg_addr=((reg_addr&0x0FFF) | 0x3000);
        pTxData[0]=(uint8_t)(reg_addr>>8);
        pTxData[1]=(uint8_t)(reg_addr>>0);
        pTxData[2]=(uint8_t)(reg_addr>>0);       
        pRxData[0] = SPI_FLASH_SendByte(SPIx,pTxData[0]);
        pRxData[1] = SPI_FLASH_SendByte(SPIx,pTxData[1]);
        pRxData[2] = SPI_FLASH_SendByte(SPIx,pTxData[2]);
        register03 = pRxData[2] ;
       
        //0x04
        reg_addr = 0x04 ;
        reg_addr=((reg_addr&0x0FFF) | 0x3000);
        pTxData[0]=(uint8_t)(reg_addr>>8);
        pTxData[1]=(uint8_t)(reg_addr>>0);
        pTxData[2]=(uint8_t)(reg_addr>>0);       
        pRxData[0] = SPI_FLASH_SendByte(SPIx,pTxData[0]);
        pRxData[1] = SPI_FLASH_SendByte(SPIx,pTxData[1]);
        pRxData[2] = SPI_FLASH_SendByte(SPIx,pTxData[2]);
        register04 = pRxData[2] ;
       
        //0x05
        reg_addr = 0x05 ;
        reg_addr=((reg_addr&0x0FFF) | 0x3000);
        pTxData[0]=(uint8_t)(reg_addr>>8);
        pTxData[1]=(uint8_t)(reg_addr>>0);
        pTxData[2]=(uint8_t)(reg_addr>>0);       
        pRxData[0] = SPI_FLASH_SendByte(SPIx,pTxData[0]);
        pRxData[1] = SPI_FLASH_SendByte(SPIx,pTxData[1]);
        pRxData[2] = SPI_FLASH_SendByte(SPIx,pTxData[2]);
        register05 = pRxData[2] ;
       
        //0x06
        reg_addr = 0x06 ;
        reg_addr=((reg_addr&0x0FFF) | 0x3000);
        pTxData[0]=(uint8_t)(reg_addr>>8);
        pTxData[1]=(uint8_t)(reg_addr>>0);
        pTxData[2]=(uint8_t)(reg_addr>>0);       
        pRxData[0] = SPI_FLASH_SendByte(SPIx,pTxData[0]);
        pRxData[1] = SPI_FLASH_SendByte(SPIx,pTxData[1]);
        pRxData[2] = SPI_FLASH_SendByte(SPIx,pTxData[2]);
        register06 = pRxData[2] ;
       
        SPI_SoftwareControlCSSConfig(SPIx,SPI_SoftwareControlCSS_High);
       
        //calculator angle here
        angle = ((register03<<16)|(register04<<8)|(register05));
        angle >>= 3;
       
//        printf("reg03=%d reg04=%d reg05=%d\r\n", register03, register04, register05) ;
        printf("angle=%.2f\r\n", angle*360.0/2097152) ;

}

int main (void)
{
        UART_GPIO_Config();
        UART_Mode_Config();
        printf("正在读取flash信息\r\n");
        SPI_GPIO_Config();
       
        FLASH_Init(SPI);
        Software_Delay();
       
        SPI_Flash_WriteByte(SPI, 0x33) ;
//        DeviceID= SPI_FLASH_ReadID(SPI);
//        printf("Device ID:%X\r\n",DeviceID);
//         SPI_Flash_ReadByte(SPI, 0x0100, 0x3000);
//        FLASH_ReadWrite(SPI,0x000);
        while(1)
        {
                ReadAngle(SPI) ;
//                  angledata = (SPI_Flash_ReadByte(SPI,0x03)<<16) |  (SPI_Flash_ReadByte(SPI,0x04)<<8) | SPI_Flash_ReadByte(SPI,0x05) ;
//                SPI_Flash_ReadByte(SPI,0x03);
//                SPI_Flash_ReadByte(SPI,0x04);
//                SPI_Flash_ReadByte(SPI,0x05);
//                SPI_Flash_ReadByte(SPI,0x06);
//                printf("read=%.2f\r\n", angledata *360.0/2097152) ;
//                printf("123456789\r\n");
//         SPI_Flash_ReadByte(SPI, 0x3333, 0xA000);
                Software_Delay();
        }
}


#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(u8* file, u32 line)
{
        /* User can add his own implementation to report the file name and line number,
           ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
        printf("Wrong parameters value: file %s on line %d\r\n", file, line);
        /* Infinite loop */
        while (1)
        {
        }
}
#endif


PT32L007F8P7K.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

440

帖子

4

粉丝