您好!
我正在使用基于 cc430f5137的项目。 在这里、我面临以下问题、实际上我正在尝试通过 I2C 协议将 EEPROM 与微控制器连接。
这里、我使用软件协议进行 I2C 通信、我使用以下位:P1.3用于 SDA、P1.2用于 SCL、P1.1用于 WP。
首先、我尝试将地址发送到 EEPROM 以识别从器件、这里成功写入 add 指令、EEPROM 向主器件提供 ACK。
3之后,我尝试向其发送添加字,这里的 EEPROM 没有向主器件发送 ACK。
这是实际面临的问题
EEPROM 部件号为:AT24LC024
我在这里附上了我的固件详细信息。 请帮帮我。
/********* main.c ********* /
#include "cc430f5137.h"
#include "EEPROM.h"
#include
//#include "TI_USCI_I2C_MASTER.h"
unsigned int i=0;
void main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
UCSCTL3 |= SELREF_2;//设置 DCO FLL 基准= REFO
UCSCTL4 |= SELA_2;//设置 ACLK = REFO
//将 DCO 初始化为8MHz
_bis_SR_register (SCG0);//禁用 FLL 控制循环
UCSCTL0 = 0x0000;//设置可能的最低 DCOx、MODx
UCSCTL1 = DCORSEL_5;//针对 DCO = 16MHz 设置 RSELx
UCSCTL2 = FLLD_1 + 249;//将 DCO 乘法器设置为8MHz
//(N + 1)* FLLRef = Fdco
//(74 + 1)* 32768 = 8MHz
//设置 FLL Div = fDCOCLK/2
_BIC_SR_register (SCG0);//启用 FLL 控制环路
_DELAY_CYCLES (250000);
register_write1();
register_read();
}
/ /
/******** EEPROM.c ********* /
#include "cc430f5137.h"
#include "EEPROM.h"
#define EEPROM_PAGE_SIZE 128 //64 // AT24C256具有64字节的页大小
unsigned char UART_buffer[35]、rart_buffer[35]、rbuffer[40]、Internal_Flash_Values[40]={'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'、'0'};
//TI_CC_WAIT (35);DCO 以8MHz 运行时的延迟时间为5.6uS
//TI_CC_WAIT (70);DCO 以8MHz 运行时的延迟时间为11.2uS
void TI_CC_WAIT (无符号 int 周期)
{
while (cycles >15)//开销占用的15个周期
周期=周期- 6;//每次迭代消耗6个周期
}
空起始(空)
{
sdaout();
EEPROM_OUT |= SDA_EEPROM;
EEPROM_OUT |= SCL_EEPROM;
EEPROM_OUT &=~SDA_EEPROM;
TI_CC_WAIT (35);//delay 5.6uS
EEPROM_OUT &=~SCL_EEPROM;
}
void stop (void)(空)
{
sdaout();
EEPROM_OUT &=~SDA_EEPROM;
EEPROM_OUT &=~SCL_EEPROM;
EEPROM_OUT |= SCL_EEPROM;
TI_CC_WAIT (35);//delay 5.6uS
EEPROM_OUT |= SDA_EEPROM;
}
void sendb (无符号字符 c)
{
unsigned char i;
for (i=0;i<8;i++)
{
if (c&0x80)
{
EEPROM_DIR |=SDA_EEPROM;
EEPROM_OUT |=SDA_EEPROM;//SDA=1
TI_CC_WAIT (35);//delay 5.6uS
}
其他
{
EEPROM_DIR |=SDA_EEPROM;
EEPROM_OUT&&=~SDA_EEPROM;//SDA=0;
TI_CC_WAIT (35);//delay 5.6uS
}
C=c<<1;
EEPROM_DIR |=SCL_EEPROM;
EEPROM_OUT |=SCL_EEPROM;// SCL=1;
TI_CC_WAIT (35);//delay 5.6uS
EEPROM_DIR |=SCL_EEPROM;
EEPROM_OUT&&=~SCL_EEPROM;//SCL=0;
TI_CC_WAIT (35);//delay 5.6uS
}
}
unsigned char getack_ee (空)
{
unsigned char ack=0;
EEPROM_DIR |=SDA_EEPROM;
EEPROM_OUT |=SDA_EEPROM;//SDA=1
TI_CC_WAIT (10);//延迟1.6uS
EEPROM_DIR |= SCL_EEPROM;
EEPROM_OUT &=~SCL_EEPROM;//SCL=0;
TI_CC_WAIT (35);//delay 5.6uS
EEPROM_DIR &=~(SDA_EEPROM);//
EEPROM_DIR |= SCL_EEPROM;
EEPROM_OUT |= SCL_EEPROM;// SCL=1;
TI_CC_WAIT (35);//delay 5.6uS
ACK=(char)(EEPROM_IN 和 SDA_EEPROM);
EEPROM_DIR |= SCL_EEPROM;
EEPROM_OUT &=~SCL_EEPROM;//SCL=0;
TI_CC_WAIT (35);//delay 5.6uS
返回(ACK 和 SDA_EEPROM);
}
void Registers_write1 (void)
{
int i;
EEPROM_DIR |= 0x0E;//0x07;
EEPROM_OUT &=~EEPROM_WP;
TI_CC_WAIT (35);
对于(i=0;i<10;i++)
{
EEPROM_w_BYTE (I、Internal_Flash_Values[i]);
TI_CC_WAIT (35);
}
EEPROM_OUT |= EEPROM_WP;
TI_CC_WAIT (35);
}
void EEPROM_w_BYTE (无符号字符添加、无符号字符值)
{
start();//开始 i2c 通信
sendb (0xA0);//发送器件地址
if (getack_ee ())
{
stop();
}
sendb (add);//发送地址字的高位字节
if (getack_ee ())
{
stop();
}
sendb (value);//发送数组数据
if (getack_ee ())
{
stop();
}
stop();// i2c 通信的停止条件
}
void Registers_read (void)
{
int i;
EEPROM_DIR |= 0x0E;//0x07;
TI_CC_WAIT (35);
对于(i=0;i<10;i++)
{
EEPROM_r_BYTE (i、&ruart_buffer[i]);
TI_CC_WAIT (35);
}
TI_CC_WAIT (35);
}
void EEPROM_r_BYTE (unsigned char add、unsigned char * buffer)
{
start();//开始 i2c 通信
sendb (0xA0);//发送器件地址
if (getack_ee ())
{
stop();
}
sendb (add);//发送地址字的高位字节
if (getack_ee ())
{
stop();
}
start();//开始 i2c 通信
sendb (0xA1);//发送数组数据
if (getack_ee ())
{
stop();
}
*buffer = read();//从 EEPROM 读取一个字节
putack_i2c (0);
stop();// i2c 通信的停止条件
}
void putack_i2c (无符号字符 ACK)
{
if (ack=0)
{
EEPROM_DIR |=SDA_EEPROM;
EEPROM_OUT&&=~SDA_EEPROM;//SDA=0;
TI_CC_WAIT (10);
}
其他
{
EEPROM_DIR |=SDA_EEPROM;
EEPROM_OUT |=SDA_EEPROM;//SDA=1
TI_CC_WAIT (10);
}
EEPROM_DIR |=SCL_EEPROM;
EEPROM_OUT |=SCL_EEPROM;// SCL=1;
TI_CC_WAIT (10);
EEPROM_DIR |=SCL_EEPROM;
EEPROM_OUT&&=~SCL_EEPROM;//SCL=0;
TI_CC_WAIT (10);
}
/ /