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
|