请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP430G2553 大家好,
标题:将EEPROM CAT2.5128万与MSP430g2553连接。
IDE:CCS
问题:我使用EEPROM进行读写的次数是10次中的3次。
有时我读的数据与写的数据相同。
有时我会得到以前的数据。
有时在“读取状态寄存器”上,我在 UCA0RXBUF中得到了0xFF。(这种情况经常发生,不应该发生)
我在这里附加代码文件。
请告诉我是否配置有任何错误。
奇怪:数据表说EEPROM在SPI模式00和11上工作,但我在模式01上得到输出(当然不是每次)。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////main.c///////////////////////////////////////////////////////////////gie.c///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//等待从属设备初始化
p=readByte(0x0008);
delay();
}/////////////////////////////////////////////////////////////
SPI.c///////////////////////////////////////////////////
#include <MSP430-h>
#include "SPI.h"
//#include "eeprom.h"
#include "stdint.h"
void SPI_init(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器
P1OUT = 0x00; // P1 LED设置和重置输出
BCSCTL1 = CALC1_1MHz; //将DCO设置为8MHz
DCOCTL = CALDCO_1MHz; //将DCO设置为8MHz
P1DIR || BIT0 + BIT5; //
P1SEL = BIT1 + BIT2 + BIT4;
P1SEL2 = BIT1 + BIT2 + BIT4;
UCA0CTL0 |= UCCKPL + UCMSB + MST + UCSYNC;// 3引脚,8位SPI主控
// UCA0CTL0 |= 0xC0;/UCA0SPI主控,3位
// 3引脚,8位SPI主控
UCA0CTL1 || UCSSEL_2; // SMCLK
UCA0BR0 |= 0x02; ///2
UCA0BR1 = 0; //
UCA0MCTL = 0; //无调制
UCA0CTL1 &=~UCSWRST; //**初始化USCI状态机**
//UCA0CTL1 || UCSWRST; //**初始化USCI状态机**
// IE2 |= UCA0RXIE; //启用USCI0 RX中断
P1OUT &=~BIT5; //现已初始化SPI信号,
P1OUT |= BIT5; //重置从属
设备}
void select_chip()
{
P1OUT &=~BIT0;
}
void Desect_chip()
{
P1OUT |= BIT0; //如果正确,指示灯LED
}
uint8_t send_byte_spi (uint8_t byte)
{
uint8_t received_byte;
UCA0TXBUF =字节; //传输第一个字符
//delay();
//__delay_cycles(100); //等待从属设备初始化
received_byte = UCA0RXBUF;
返回received_byte;
}
void delay()
{
__delay_cycles(1万); //等待从属设备初始化
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////
eeprom.c/////////////////////////////////////
#include <MSP40.0>
#include <stdbool.h>
#include "spi.h"
#include
"stdint.h"
uint8_t ret1;
uint8_t hb,lb;
uint8_t getstatusregister()
{uint8_t
dummy;startCommand(EPROM_CAT25_command_rf_rendr);
添加
了eeprom_r=0, f_crue_cruet_cruet=0; sf_cruet_cruet_cr==0; f_cruet_cruet_cruet_cruet_cr===0; f_cruet_cruet_cruet_cruet_cruet=)
return(ret);
}
void startCommand(uint8_t命令,const uint16_t地址)
{//
_SPI->beginTransaction(_spiSettings);
select_chip();
/* if (command == eeprom_CAT25_command_read){
命令= eeprom_CAT25_command_read_A8_high;
} 如果(命令== eeprom_cat25_command_write){
命令= eeprom_CAT25_command_write_A8_high;
}
*/
//delay();//
_SPI->transfer(command);
ret1 = send_byte_spi (命令);
//__delay_cycles (1000); //等待从属设备初始
化,如果(命令== eeprom_CAT25_command_read ||命令== eeprom_CAT25_command_write){
sendAddressBytes(address);
}
}void sendAddressBytes(const uint16_t address)
{uint8_t pp;
/* if (EEPROM_Capacity_CAT2.5128万>0x10000){1万{
//_SPI->transfer (((uint8_t)((address >>16)& 0xFF));
* HB =
pp = send_byte_spi((((uint8_t)((address >> 16)& 0xFF));
}*/
IF (eeprom_capacity_CAT2.5128万 > 0x100)){//
_spi->transfer(((uint8_t)((((address>8)& 0xFF)= xbytes=)= ut=0scapsf(psi=)*psi=xpp; sendsf=0spi=)(((<)xpp_8lbyte_psf)=)=)=0sendsendsf=0spi=)=
xf=0spi=8 scapscapscapscapsf(((<)=
xpp)
//传输第一个字符
UCA0TXBUF = 0x00; //传输第一个字符
}*/
bool isReady(void)
{
IF (getstatusregister()& EEPROM_CAT25_RDY_MSK)== eeprom_CAT25_RDY_BUSY){
return(fals);
}
return(true);
}
void endCommand(void)
{
// delay();
desece_chip();
//_SPI->endTransaction();
}
void enableWrite(void)
{
startCommand(EEEPROM_CAT25_command_WREN, 0);
endCommand();
enddisableWriteWrite(void_Write(void)
{_128_ut_Command_128_ut_DI=<cand_128_capacity)
{{<catut_128_connect_capacity=<_128_128_connect=<={<cut_128_capacity=_128_128_connect=<cand_<_<_capity=
return(0);
}
while (!isReady()){//
yle()
;
}
startCommand(EEPROM_CAT25_command_read, address);
// ret = send_byte_SPE(EEPROM_CAT25_byte_byte);
delay();
do {
startret = send_byte_ret(dummy _CAT25_FF_read);
while =;}_eeprom =;}/REEPROM(command=
uINT8_t writeByte (const uint16_t地址,const uint8_t字节)
{
IF (地址>= eeprom_capacity_CAT2.5128万){
return(0);
}
while (!isReady()){
//YIEW();;}enableWrite()
;
startCommand(EEEPROM_CAT25_COMMAND_WRITE,地址);
send_byte_spi (字节);
endCommand();
return(1);
}/////////////////////////////////////////////////////////
eeprom.h///////////////////////////////////////////////////////////////////////////////////////////////////
#include <MSP430-h>
#include <stdbool.h>
#include "stdint.h"
#define DI_CAT25_dummy_byte 0xFF
//所有芯片都支持的命令
#define eeprom_CAT25_command_read 0x03
#define eeprom_CAT25_cat25_read 0x20_cat25_bits
#define
命令#eePROM_R2500.125万_CAT25010_CAT25010_CAT25010_CAT25010_RE10#define #RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_2.501万 #RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_RE10_</s>2.501万 2.501万2.501万
而
*较大的EEPROM使用16位(或1Mbit及以上的芯片使用24位)。
*但CAT2.504万需要9位,因此
*读或写指令的位位置3用作地址的第9位。
//
定义eeprom_CAT25_command_read_a8_high 0x0B
#define eeprom_CAT25_command_read_a8_high 0x13
//#define eeprom_CAT25_command_write_a8_high 0x0A
#define eeprom_cat_cat25_eeprom_clue_rdy_ge_high 0
eeprom <_cat25_cat_eeprop_cat_cat_read_eeprop_cat25_eeprop_cat_cat_eeprop_cr_cat_<_cat25_eeprop_ve_z_cat_cat_cr_<_cat_cr_<_cr_cat_cr_cat_<_cr_cr_cat_cr_cr_cat25_cat25_cat_cat_
void startCommand (uint8_t命令,const uint16_t地址);
void sendAddressBytes (const uint16_t地址);
void endCommand (void);
bool isReady (void);
void enableWrite (void);
void disableWrite(void);
uINT8_t readByte (const uint16_t地址);
uint8_t writeByte (const uint16_t地址,const uint8_t字节);