15bit磁编码器 MT6826S 麦歌恩 &澎湃微 PT32L007F8P7K 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
 

  • 35
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值