|
目前手上有开发板(STM32-PZ6806L)及一个指纹模块, 指纹模块是通过SPI进行数据传输, 通过杜邦线对应连结:SPI1_SCK->CLK、SPI1_MISO->MISO、SPI1_MOSI->MOSI、SPI1_NSS->CS、STM3.3V->3.3v、STM32_GND->GND.指纹模块的SPI信息为:SPI 从接口仅支持 CPHA=0, CPOL=0 传输模式, SPI 时钟最高频率可支持到 12MHz,时序如图, 操作部分:
写 SRAM 空间 命令 0 高地址 低地址 8bit 数据 0 8bit 数据 1 …… ……读 SRAM 空间 命令 1 高地址 低地址 Nop 8bit 数据 0 8bit 数据 1 ……
写 SFR 空间 命令 2 高地址 低地址 8bit 数据 0 …… …… ……
读 SFR 空间 命令 3 高地址 低地址 8bit 数据 0 …… …… ……
读图像 命令 4 高地址 低地址 Nop 8bit 数据 0 …… ……
代码部分:
void SPI_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* SPI1: SCK,MOSI复用输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* SPI1: MISO浮动输入 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* SPI1: CS推挽输出 */
GPIO_InitStructure.GPIO_Pin = PIN_SPI_CS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(PORT_SPI_CS, &GPIO_InitStructure);
}
void SPI_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
/* SPI 初始化定义 */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置为主 SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI发送接收 8 位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟空闲为低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟沿
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件控制 NSS 信号
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //波特率预分频值为2
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //定义了用于 CRC值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE); //使能 SPI1
}
void SPI_Initializes(void)
{
SPI_GPIO_Configuration();
SPI_Configuration();
}
uint8_t SPI_WriteReadByte(uint8_t TxData)
{
while((SPI1->SR & SPI_I2S_FLAG_TXE) == (uint16_t)RESET);
SPI1->DR = TxData;
while((SPI1->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);
return SPI1->DR;
}
void SPI_FLASH_BufferRead(u8* pBuffer, int16_t NumByteToRead)
{
u8 cmd = 0x04;
while (NumByteToRead--)
{
*pBuffer = SPI_WriteReadByte(cmd);
printf("*pBuffer=%x, NumByteToRead= %d \r\n", *pBuffer, NumByteToRead);
pBuffer++;
}
}
目前通过调用SPI_FLASH_BufferRead, 打印出来的都是0, 麻烦帮忙看看, 谢谢!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|