1111
/**
* @Author: wangxy
* @Date: 2024-03-16
* @LastEditTime: 2024-03-19
* @LastEditors: wangxy
* @Description: proj_eeprom
* @FilePath: proj_eeprom.c
*/
#include "proj_eeprom.h"
/**
* @details: This function is IIC Init
*/
void IIC_Init(void)
{
/* Unlock protected registers */
SYS_UnlockReg();
/* Enable GPIOC clock */
CLK->AHBCLK0 |= CLK_AHBCLK0_GPCCKEN_Msk;
/* Lock protected registers */
SYS_LockReg();
/* INIT SCL SDA OUTPUT */
GPIO_SetMode(PC, BIT0, GPIO_MODE_OUTPUT);
GPIO_SetMode(PC, BIT1, GPIO_MODE_OUTPUT);
IIC_SCL_PIN = 1;
IIC_SDA_PIN = 1;
}
/**
* @details: This function is IIC Start
*/
void IIC_Start(void)
{
IIC_SDA_OUT();
SDA_HIGH();
SCL_HIGH();
delay_us(5);
SDA_LOW();
delay_us(4);
SCL_LOW(); //钳住时钟,开始发送数据
}
/**
* @details: This function is IIC Stop
*/
void IIC_Stop(void)
{
SCL_LOW(); //保证SCL为低
IIC_SDA_OUT();
SDA_LOW();
delay_us(5);
SCL_HIGH();
delay_us(4);
SDA_HIGH();
delay_us(4);
}
/**
* @details: This function is IIC SendAck
*/
void IIC_SendAck(void)
{
SCL_LOW(); //保证SCL为低
IIC_SDA_OUT();
SDA_LOW();
delay_us(2);
SCL_HIGH();
delay_us(4);
SCL_LOW(); //钳住时钟,开始下一次发送数据
}
/**
* @details: This function is IIC SendNoAck
*/
void IIC_SendNoAck(void)
{
SCL_LOW(); //保证SCL为低
IIC_SDA_OUT();
SDA_HIGH();
delay_us(4);
SCL_HIGH();
delay_us(4);
SCL_LOW(); //钳住时钟,开始下一次发送数据
}
/**
* @details: This function is IIC WaitforAck
*/
int8_t IIC_WaitforAck(void)
{
uint8_t count = 0;
SCL_LOW(); //保证SCL为低
IIC_SDA_IN();
SDA_HIGH();
delay_us(3);
SCL_HIGH();
delay_us(3);
while(SDA_READ()){
delay_us(1);
if (count++ > 250){
IIC_Stop();
RS_LOGE("IIC_WaitforAck failed\n");
return -1;
}
}
SCL_LOW(); //钳住时钟,开始下一次发送数据
return 0;
}
/**
* @details: This function is IIC Send Byte Data
*/
int8_t IIC_SendByteData(uint8_t data)
{
uint8_t i=0;
SCL_LOW(); //保证SCL为低
IIC_SDA_OUT();
for(i=0; i<8; i++){
delay_us(2);
if(data&0x80){
SDA_HIGH();
}else{
SDA_LOW();
}
data <<= 1;
delay_us(2);
SCL_HIGH();
delay_us(2); //留给从机读取数据的时间
SCL_LOW(); //钳住时钟,开始下一次发送数据
}
//发送完成等待ACK
retuen IIC_WaitforAck();
}
/**
* @details: This function is IIC Rcv Byte Data
*/
uint8_t IIC_RcvByteData(uint8_t ackFlag)
{
uint8_t i;
uint8_t rcvData = 0;
IIC_SDA_IN();
for(i=0; i<8; i++){
SCL_LOW();
delay_us(2);//留给从机发送数据的时间
SCL_HIGH();
rcvData <<= 1;
if(SDA_READ())
rcvData |= 0x01;
delay_us(2);
}
if(!ackFlag){
//发送NOACK
IIC_SendNoAck();
}else{
//发送ACK
IIC_SendAck();
}
SCL_LOW(); //钳住时钟,开始下一次发送数据
return rcvData;
}
/**
* @details: This function is IIC ROM24CXX_WriteOneByte
*/
int8_t ROM24CXX_WriteOneByte(uint16_t WriteAddr, uint8_t DataToWrite)
{
IIC_Start();
if(EE_TYPE>AT24C16){
if(IIC_SendByteData(Device_ADDR)<0){
return -1;
}
if(IIC_SendByteData(WriteAddr>>8)<0){
return -1;
}
}else{
if(IIC_SendByteData(Device_ADDR+((WriteAddr/256)<<1))){
return -1;
}
}
if(IIC_SendByteData(WriteAddr%256)<0){
return -1;
}
if(IIC_SendByteData(DataToWrite)<0){
return -1;
}
IIC_Stop();
delay_us(10);
}
/**
* @details: This function is IIC ROM24CXX_ReadOneByte
*/
int8_t ROM24CXX_ReadOneByte(uint16_t ReadAddr)
{
uint8_t temp=0;
IIC_Start();
if(EE_TYPE>AT24C16){
if(IIC_SendByteData(Device_ADDR)<0){
return -1;
}
if(IIC_SendByteData(ReadAddr>>8)<0){
return -1;
}
}else{
if(IIC_SendByteData(Device_ADDR+((ReadAddr/256)<<1))){
return -1;
}
}
if(IIC_SendByteData(ReadAddr%256)){
return -1;
}
IIC_Start();
if(IIC_SendByteData(Device_ADDR | 0x01)){
return -1;
}
temp =IIC_RcvByteData(0);
IIC_Stop();
return temp;
}
/**
* @details: This function is IIC ROM24CXX_WriteLenByte
*/
void ROM24CXX_WriteLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len)
{
uint8_t t;
for(t=0;t<Len;t++){
ROM24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
delay_ms(10);
}
}
/**
* @details: This function is IIC ROM24CXX_Write
*/
void ROM24CXX_Write(uint16_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite)
{
while(NumToWrite--){
ROM24CXX_WriteOneByte(WriteAddr,*pBuffer);
WriteAddr++;
pBuffer++;
delay_ms(10);
}
}
/**
* @details: This function is IIC ROM24CXX_ReadLenByte
*/
uint32_t ROM24CXX_ReadLenByte(uint16_t ReadAddr, uint8_t Len)
{
uint8_t t;
uint32_t temp=0;
for(t=0;t<Len;t++){
temp<<=8;
temp+=ROM24CXX_ReadOneByte(ReadAddr+Len-t-1);
delay_ms(10);
}
return temp;
}
/**
* @details: This function is IIC ROM24CXX_Read
*/
void ROM24CXX_Read(uint16_t ReadAddr, uint8_t *pBuffer, uint16_t NumToRead)
{
while(NumToRead){
*pBuffer++=ROM24CXX_ReadOneByte(ReadAddr++);
NumToRead--;
delay_ms(10);
}
}
/**
* @details: This function is IIC ROM24CXX_Check
*/
uint8_t ROM24CXX_Check(void)
{
uint8_t temp;
temp=ROM24CXX_ReadOneByte(0x25);
if(temp==0x55){
RS_LOGV("ROM24CXX_Check ok, value: 0x%x\n", temp);
return 0;
}else{
ROM24CXX_WriteOneByte(0x25,0x55);
temp=ROM24CXX_ReadOneByte(0x25);
if(temp==0x55){
RS_LOGV("Again ROM24CXX_Check ok\n");
return 0;
}
}
RS_LOGE("ROM24CXX_Check failed, value: 0x%x\n", temp);
return 1;
}
/**
* @details: This function is Eeprom Proc
*/
void Eeprom_Proc(void)
{
RS_LOGV("Eeprom_Proc ok");
IIC_Init();
delay_ms(100);
ROM24CXX_Check();
const uint8_t TEXT_WDBuffer[]={"ROM24CXX IIC DATA READ WRITE TEST OK"};
ROM24CXX_Write(0,(uint8_t*)TEXT_WDBuffer,sizeof(TEXT_WDBuffer));
uint8_t TEXT_RDBuffer[sizeof(TEXT_WDBuffer)];
ROM24CXX_Read(0,(uint8_t*)TEXT_RDBuffer,sizeof(TEXT_WDBuffer));
RS_LOGV("%s\n",TEXT_RDBuffer);
for(;;){
vTaskDelay(1000);
}
}
Stay hungry, stay foolish
待续。。。

浙公网安备 33010602011771号