在 msp430fr6047中使用24LC512 EEPROM 的 Im
我能够使用该代码写入一些数据/值、并通过 Arduino 读取、但不能使用我的 MSP430读取。
(要查看我通过人类可读逻辑进行的 UART 通信的输出)
我提供的读取代码似乎不起作用
在代码的末尾、我还提供了写入代码、当我使用 ardunio IDE 读取时、可以在 arduno 中发挥作用
//---- 使用 MSP430读取
#包含
#包含
#define ENABLE_PINS 0xFFFE
#define EEPROM_ADDR 0x50 // EEPROM 的 I2C 地址
#define EEPROM_DATA_ADDR 0 //从 EEPROM 读取数据的起始地址
#define data_size 10 //数据数组大小
uint8_t dataRead [data_size];//存储读取数据的数组
void init_i2C(){
P8SEL0 |= BIT5 | BIT6;
P8SEL1 &=~(BIT5 | BIT6);
//初始化 I2C 模块(USCI_B1)
UCB1CTLW0 |= UCSWRST;//启用软件复位
UCB1CTLW0 |= UCSSEL_SMCLK;//选择 SMCLK 作为时钟源
UCB1BRW = 80;//针对所需的 SCL 频率设置时钟分频器
UCB1CTLW0 |= UCMODE_3 | UCMST;// I2C 模式、主模式
UCB1CTLW1 |= UCASTP_2;//在达到 UCB1TBCNT 后生成自动停止
UCB1CTLW0 &=~μ V UCSWRST;//清除软件复位以启动 USCI
}
void uart_init(){
//配置 UART 引脚
P8SEL0 |= BIT2 | BIT3;// P8.2 = TX、P8.3 = RX
P8SEL1 &=~(BIT2 | BIT3);
//配置 UART 设置
UCA3CTLW0 |= UCSWRST;//将 UART 模块置于复位状态
UCA3CTLW0 |= UCSSEL_SMCLK;//选择 SMCLK 作为时钟源
UCA3BR0 = 104;//将波特率设置为9600 (假设 SMCLK 为1MHz)
UCA3MCTLW = 0x2000;//设置调制(UCBRSx = 4、UCBRFx = 1、UCOS16 = 0)
UCA3BR1=0;
UCA3CTLW0 &=μ~UCSWRST;//初始化 UART 模块
}
void uart_sendInt (int 值)
{
//将整数转换为字符串
char buffer[6];// Buffer 用于将整数存储为字符串(假设最大长度为5位)
INT I = 0;
如果(值< 0)
{
UCA3TXBUF ='-';//对于负数发送'-'
value =-value;//将值转换为正数/
I++;
}
正确
{
Buffer[i++]=值% 10 +'0';//将每个数字转换为字符
value /= 10;
}
while (值!= 0);
//以相反的顺序发送字符
while (--i >= 0)
{
while (! (UCA3IFG & UCTXIFG));//等待 UART 缓冲区就绪
UCA3TXBUF = buffer [i];//发送字符
}
}
void readFromEEPROM (uint16_t address、uint8_t * data、uint16_t dataSize){
//设置从机地址
UCB1I2CSA =(0xA0 >> 1);
//发送启动条件
UCB1CTLW0 |= UCTR | UCTXSTT;
//等待开始条件的发送
// while (UCB1CTLW0 & UCTXSTT);
__delay_cycles (600);
//发送要读取的内存地址
UCB1TXBUF =(地址>> 8)& 0xFF;//高字节
//while (! (UCB1IFG & UCTXIFG));//等待 TX 缓冲区准备就绪
__delay_cycles (600);
UCB1TXBUF =地址& 0xFF;//低字节
// while (! (UCB1IFG & UCTXIFG));//等待 TX 缓冲区准备就绪
__delay_cycles (600);
UCB1I2CSA =(0xA0 >> 1);
//发送重复启动条件并设置为读取模式
UCB1CTLW0 |= UCTXNACK;
__delay_cycles (600);
// UCB1CTLW0 |= UCTXSTT;//st 位
//_delay_cycles (600);
UCB1CTLW0 &=~μ s UCTR;
uint16_t i;
//从 EEPROM 读取数据
for (i = 0;i < dataSize;i++){
__delay_cycles (900);// while (! (UCB1IFG & UCRXIFG));//等待 RX 缓冲区填满
data[i]= UCB1RXBUF;//读取数据字节
如果(i == dataSize - 1)
{
//为最后一个字节发送 NACK 和 STOP 条件
UCB1CTLW0 |= UCTXNACK | UCTXSTP;
}
}
}
int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
PM5CTL0 = ENABLE_PINS;//解锁引脚
INIT_I2C();
uart_init();
//从 EEPROM 读取数据
readFromEEPROM (EEPROM_DATA_ADDR、dataRead、DATA_SIZE);
INT I;
//通过 UART 发送读数据作为整数
对于(I = 0;I < data_size;I++){
uart_sendInt (dataRead [i]);
// uart_sendInt (dataRead [i]);
// UCA3TXBUF = dataRead [i];
// while (! (UCA3IFG & UCTXIFG));
// UCA3TXBUF ='\n';
// while (! (UCA3IFG & UCTXIFG));
}
while (1);//无限循环
返回0;
}
//---- 使用 MSP430编写代码
#包含
#包含
#define ENABLE_PINS 0xFFFE
#define EEPROM_ADDR 0x50 // EEPROM 的 I2C 地址
#define EEPROM_DATA_ADDR 0 //将数据写入 EEPROM 的起始地址
#define data_size 10 //数据数组大小
uint8_t dataToWrite[data_size]={0x30、0x31、0x32、0x33、0x34、0x35、0x36、0x37、0x38、0x39};//待写入的数据
void init_i2C(){
P8SEL0 |= BIT5 | BIT6;
P8SEL1 &=~(BIT5 | BIT6);
//初始化 I2C 模块(USCI_B1)
UCB1CTLW0 |= UCSWRST;//启用软件复位
UCB1CTLW0 |= UCSSEL_SMCLK;//选择 SMCLK 作为时钟源
UCB1BRW = 80;//针对所需的 SCL 频率设置时钟分频器
UCB1CTLW0 |= UCMODE_3 | UCMST;// I2C 模式、主模式
UCB1CTLW1 |= UCASTP_2;//在达到 UCB1TBCNT 后生成自动停止
UCB1CTLW0 &=~μ V UCSWRST;//清除软件复位以启动 USCI
}
void writeToEEPROM (uint16_t address、uint8_t * data、uint16_t dataSize){
//设置从机地址
UCB1I2CSA =(0xA0 >> 1);
//发送启动条件
UCB1CTLW0 |= UCTR | UCTXSTT;
//等待开始条件的发送
// while (UCB1CTLW0 & UCTXSTT);
__delay_cycles (600);
//发送要写入的存储器地址
UCB1TXBUF =(地址>> 8)& 0xFF;//高字节
__delay_cycles (600);
// while (! (UCB1IFG & UCTXIFG));//等待 TX 缓冲区准备就绪
UCB1TXBUF =地址& 0xFF;//低字节
__delay_cycles (600);
// while (! (UCB1IFG & UCTXIFG));//等待 TX 缓冲区准备就绪
uint16_t i=0;
//将数据写入 EEPROM
对于(i = 0;i < dataSize;i++){
UCB1TXBUF =数据[i];
__delay_cycles (600);//写入数据字节
// while (! (UCB1IFG & UCTXIFG));//等待 TX 缓冲区准备就绪
}
//发送停止条件
UCB1CTLW0 |= UCTXSTP;
}
int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
PM5CTL0 = ENABLE_PINS;//解锁引脚
INIT_I2C();
writeToEEPROM (EEPROM_DATA_ADDR、dataToWrite、DATA_SIZE);
while (1);//无限循环
返回0;
}