SPI1_IO_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_Struct_Init(&GPIO_InitStructure);
GPIO_Struct_Init(&GPIO_InitStructure);
GPIO_InitStructure.m_Mode = GPIO_MODE_OUT;
GPIO_InitStructure.m_OpenDrain = GPIO_POD_PP;
GPIO_InitStructure.m_PullDown = GPIO_NOPULL;
GPIO_InitStructure.m_PullUp = GPIO_NOPULL;
GPIO_InitStructure.m_Speed = GPIO_HIGH_SPEED;
GPIO_InitStructure.m_Pin = GPIO_PIN_MASK_9;
GPIO_Configuration(GPIOE_SFR, &GPIO_InitStructure);
GPIO_Set_Output_Data_Bits(GPIOE_SFR, GPIO_PIN_MASK_9, Bit_SET);
GPIO_Write_Mode_Bits(GPIOF_SFR, GPIO_PIN_MASK_0 | GPIO_PIN_MASK_1, GPIO_MODE_RMP);
GPIO_Write_Mode_Bits(GPIOB_SFR, GPIO_PIN_MASK_15, GPIO_MODE_RMP);
GPIO_Pin_RMP_Config(GPIOF_SFR, GPIO_Pin_Num_0, GPIO_RMP_AF8);
GPIO_Pin_RMP_Config(GPIOF_SFR, GPIO_Pin_Num_1, GPIO_RMP_AF8);
GPIO_Pin_RMP_Config(GPIOB_SFR, GPIO_Pin_Num_15, GPIO_RMP_AF8);
}
SPI_Config(SPI_SFRmap *SPIx)
{
SPI_InitTypeDef Spi_ConfigPtr;
Spi_ConfigPtr.m_Mode = SPI_MODE_MASTER_CLKDIV4;
Spi_ConfigPtr.m_Clock = SPI_CLK_SCLK;
Spi_ConfigPtr.m_FirstBit = SPI_FIRSTBIT_MSB;
Spi_ConfigPtr.m_CKP = SPI_CKP_HIGH;
Spi_ConfigPtr.m_CKE = SPI_CKE_2EDGE;
Spi_ConfigPtr.m_DataSize = SPI_DATASIZE_8BITS;
Spi_ConfigPtr.m_BaudRate = 0x95;
SPI_Reset(SPIx);
SPI_Configuration(SPIx, &Spi_ConfigPtr);
SPI_Cmd(SPIx, TRUE);
}
void CS_Enable()
{
GPIO_Set_Output_Data_Bits(GPIOE_SFR, GPIO_PIN_MASK_9, reset);
}
void CS_Disable()
{
GPIO_Set_Output_Data_Bits(GPIOE_SFR, GPIO_PIN_MASK_9, set);
}
void CAT25160_WriteEnable()
{
CS_Enable();
SPI_TransferByte(0x06);
CS_Disable();
}
#define SPI_TIMEOUT 2048;
uint8_t SPI_TransferByte(uint8_t data)
{
uint32_t timeout = SPI_TIMEOUT;
while ((SPI_Get_Transmit_Buf_Flag(SPI1_SFR) == SET)&& (timeout-- > 0));
if(timeout == 0) return 0xFF;
timeout = SPI_TIMEOUT;
SPI_I2S_SendData32(SPI1_SFR, data);
while((SPI_Get_Receive_Buf_Flag(SPI1_SFR) == RESET)&&(timeout-- > 0));
if(timeout == 0) return 0xFF;
return SPI_I2S_ReceiveData(SPI1_SFR);
}
uint8_t CAT25160_ReadStatus()
{
uint8_t status;
uint8_t cmd = 0x05;
CS_Enable();
SPI_TransferByte(cmd);
status = SPI_TransferByte(0xFF);
CS_Disable();
return status;
}
uint8_t CAT25160_IsBusy()
{
return (CAT25160_ReadStatus() & 0x01);
}
void CAT25160_WriteDisable()
{
CS_Enable();
SPI_TransferByte(0x04);
CS_Disable();
}
void CAT25160_WriteByte(uint16_t addr, uint8_t data)
{
CAT25160_WriteEnable();
CS_Enable();
SPI_TransferByte(0X02);
SPI_TransferByte(addr>>8);
SPI_TransferByte(addr & 0xFF);
SPI_TransferByte(data);
CS_Disable();
while(CAT25160_ReadStatus() & 0x01);
}
#define PAGE_SIZE 32
void CAT25160_PageWrite(uint16_t addr, uint8_t *data, uint16_t len)
{
while(len > 0)
{
uint8_t remaining = PAGE_SIZE - (addr % PAGE_SIZE);
uint8_t chunk_len = (len > remaining) ? remaining : len;
CAT25160_WriteEnable();
CS_Enable();
SPI_TransferByte(0X02);
SPI_TransferByte(addr>>8);
SPI_TransferByte(addr & 0xFF);
for(uint8_t i=0; i<chunk_len; i++)
{
SPI_TransferByte(data[i]);
}
CS_Disable();
while(CAT25160_ReadStatus() & 0x01);
addr += chunk_len;
data += chunk_len;
len -= chunk_len;
}
}
void CAT25160_ReadData(uint16_t addr, uint8_t *buf, uint16_t len)
{
CS_Enable();
SPI_TransferByte(0x03);
SPI_TransferByte((addr >> 8)& 0xFF);
SPI_TransferByte(addr & 0xFF);
while(len--)
*buf++ = SPI_TransferByte(0xFF);
CS_Disable();
}
