This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430G2553:用于CAT2.5128万 EEPROM的SPI接口

Guru**** 2587365 points
Other Parts Discussed in Thread: MSP430G2553

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/618617/msp430g2553-spi-interface-for-cat25128-eeprom

部件号: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字节);



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Palak,

    根据CAT2.5128万数据表,输入数据锁定在SCK时钟输入的上升沿。 这有点难理解,但我将其解释为MSP430中的UCCKPH =1,其中数据在第一个UCLK边缘捕获,并在下一个边缘更改。 另外,我认为它对应于低非活动时钟极性(UCCKPL =0)。 您的代码中似乎已切换此内容。 您能否进行这些修改并告诉我是否有帮助?

    另外,请通读 MSP430 MCU上常见eUSCI和USCI串行通信问题解决方案的SPI部分 ,以详细解释最常见的SPI问题及其解决方案。  

    此致,  
    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果时钟处于低或高的怠速状态,则应该没有任何区别。 数据必须锁定在时钟信号的上升沿,因此如果时钟空闲状态为低, 然后,您必须将USCI配置为锁定第一个上的数据,并在第二个边缘更改它,如果它处于高位,则更改第一个上的数据并将其锁定在第二个边缘。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Palak,

    您是否能够解决此问题? 如果是,您是否可以将您的解决方案发布到论坛,以帮助可能遇到相同问题的其他人?

    此致,
    Caleb Overbay