国产芯片
声明:本文旨在帮助自己记录芯片的常用配置过程。同时希望分享出自己的使用经验,让更多的人加入国产芯片的开发中。
新的技术往往都来自于模仿。从模仿到超越。芯片国产化的过程需要模仿已经比较成熟的产品,让使用者好入手,增加自己的用户量。
HHD32F107 SPI通信
首先,这里使用的是单片机内部自带的SPI模块,即硬件SPI。使用硬件SPI的好处是,在进行SPI通信时,往来的数据交给外设模块处理,内核可以响应别的操作。
1. SPI模块简介
2. SPI相关的引脚
如下图所示,3路SPI引脚。
3. 软件引脚配置以及SPI初始化
ST_PINS pins_table[] =
{
__HHD_PIN(G, 11, 1, OUTPUT, GPIO_Mode_DEF), // SPI1 NSS (实际使用的是PA4 , 但是却需要配置PG11)
__HHD_PIN(A, 5, 2, OUTPUT, GPIO_Mode_DEF), // SPI1 SCLK
__HHD_PIN(A, 6, 2, INPUT, GPIO_Mode_DEF), // SPI1 MISO
__HHD_PIN(A, 7, 2, OUTPUT, GPIO_Mode_DEF), // SPI1 MOSI
};
/*
该函数可以替代统一进行的IO配置中,SPI的IO配置。
IO初始化 二选一
*/
void SPI_IOCONFIG(void)
{
#if 0
SPI1_SSEL_PG11;
SPI1_SCK_PG10 ;
SPI1_MISO_PG8 ;
SPI1_MOSI_PG9 ;
#endif
#if 1
SPI1_SSEL_PG11;
SPI1_SCK_PA5;
SPI1_MISO_PA6;
SPI1_MOSI_PA7;
#endif
}
void SPI1Init(void)
{
/*
SPI1
SSI =7 8位传输数据
主机
工作模式0 CP0L和CPHA两个寄存器
传输速率100K
*/
SPI_Open(SPI1, SPI_FRAME, 7, SPI_MASTER, SPI_MODE0, 100000);
SPI_Set_SSEL_High(SPI1);
//SPI_SetClk(SPI1,1000000);//在使能SPI之前被设置
return;
}
//主要目的是得到一个8位数据(而不是16位)
uint8_t SPIx_ReadWriteByte(HHD32F1_SPI_TypeDef* SPIx, uint16_t WriteData)
{
uint16_t data,data1;
data = WriteData;
data1=SPI_SingleWriteRead(SPIx,&data);//底层驱动
return (uint8_t)data1;
}
void SetFpgaReg(uint8_t offset,uint16_t dd)
{
SPI_Reset_SSEL_Low(SPI1);
SPIx_ReadWriteByte(SPI1,offset); //发送地址 写数据
SPIx_ReadWriteByte(SPI1,dd>>8); //高位数据
SPIx_ReadWriteByte(SPI1,dd&0xff); //低位数据
SPI_Set_SSEL_High(SPI1);
}
uint16_t GetFpgaReg(uint8_t offset)
{
uint16_t data=0xFFFF;
SPI_Reset_SSEL_Low(SPI1);
SPIx_ReadWriteByte(SPI1,offset); //发送地址
data =SPIx_ReadWriteByte(SPI1,0xff)<<8; //接收高位数据
data|=SPIx_ReadWriteByte(SPI1,0xff); //接收低位数据
SPI_Set_SSEL_High(SPI1);
return data;
}