电子说
STM32通过SPI 与EEPROM芯片M95256进行数据读写。
//SPI1 写一个字节
//TxData:要写入的字节
uint8_t SPI1_WriteByte(uint8_t TxData)
{
HAL_SPI_Transmit(&hspi1,&TxData,1, 1000);
}
//返回值:读取到的字节
uint8_t SPI1_ReadByte(void )
{
uint8_t RxData;
HAL_SPI_Receive(&hspi1,&RxData,1, 1000);
return RxData; //返回收到的数据
}
//读字节函数
void M95256_ReadByte(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead)
{
uint16_t i;
// 拉低片选信号
HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_RESET);
SPI1_WriteByte(0x03) ; // 发送READ指令(0x03)
SPI1_WriteByte((ReadAddr) > > 8);
SPI1_WriteByte(ReadAddr);
// 发送dummy数据并读取返回值
for(i=0;i< NumByteToRead;i++)
pBuffer[i]= SPI1_ReadByte(); //循环读数
// 拉高片选信号
HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_SET);
}
//SPI在一页(0~65535)内写入少于256个字节的数据
//在指定地址开始写入最大256字节的数据
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(16bit)
//NumByteToWrite:要写入的字节数(最大64),该数不应该超过该页的剩余字节数!!!
void Write_Byte(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
{
uint16_t i;
HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_RESET); //使能器件
SPI1_WriteByte(0x06) ; //写使能
HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_SET); //取消片选
HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_RESET); //使能器件
SPI1_WriteByte(0x02) ; //写使能 //发送写页命令
SPI1_WriteByte((WriteAddr) >>8); //发送16bit地址
SPI1_WriteByte(WriteAddr);
for(i=0;i< NumByteToWrite;i++)
SPI1_WriteByte(pBuffer[i]);//循环写数
HAL_Delay(5); //等待写入结束
HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_SET); //取消片选
}
main.c
uint8_t RXtxt_Buffer[100];
const uint8_t TEXT_Buffer[]={0x55,0xaa,0x55,0x55,0x55,0x55,0x55};
Write_Byte((uint8_t*)&TEXT_Buffer1,0x3001,7);
HAL_Delay(2000);
M95256_ReadByte(RXtxt_Buffer,0x3001,7);
printf("M95256_Read Data:%drn", RXtxt_Buffer[0]); //串口打印信息
printf("M95256_Read Data:%drn", RXtxt_Buffer[1]); //串口打印信息
printf("M95256_Read Data:%drn", RXtxt_Buffer[2]); //串口打印信息
printf("M95256_Read Data:%drn", RXtxt_Buffer[6]); //串口打印信息
HAL_Delay(1000);
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !