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.

[参考译文] MSP430FR2476:使用 I2C 实现 BSL 时出现问题。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1367741/msp430fr2476-problem-to-implement-bsl-using-i2c

器件型号:MSP430FR2476

工具与软件:

您好!

我正在使用 msp430fr2476实现 BSL。

我将 msp430fr2476用作从器件(BSL 目标)、外设为 i2c。

这是我的主代码。

1.将 MCLK 设置为8MHz

2.将 I2C 初始化为从设备

3.跳转至 BSL

int main(void) {
	// Stop watchdog timer
	WDT_A_hold(WDT_A_BASE);
	initClock(); // set MCLK to 8MHz
	//__enable_interrupt();
	UCB0_I2C_slave_init();

	__disable_interrupt(); // disable interrupts
	((void (*)())0x1000)(); // jump to BSL
	
	while(true);
	return 0;
}

当我 从主 MCU (ESP32)向 msp430fr2476发送 BSL 命令时、响应数据全为0。

我使用 BSL 配置更改了 BSL I2C 地址。 但结果是相同的。

这是 i2c 主代码。  

这个代码发送批量擦除 cmd、并且我也发送密码 cmd、但结果是一样的(所有字节为0)。

	int ret = 0;
	int lcnt = 0;
	uint8_t read[32] = {0, }; 
	uint8_t writeb[32] = {0x80, 0x01, 0x00, 0x15, 0x64, 0xA3}; 

	i2c_cmd_handle_t cmd = i2c_cmd_link_create();

	ESP_LOGI(TAG, "bsl erase send");
	ESP_LOG_BUFFER_HEXDUMP(TAG, writeb, 6, ESP_LOG_INFO);
	
	i2c_master_start(cmd);   // send start condition
	i2c_master_write_byte(cmd, MSP430_BSL_ADDR << 1 | I2C_MASTER_WRITE, ACK_CHECK_EN); // slave address and write bit
	i2c_master_write(cmd, writeb, 6, ACK_CHECK_EN); // write bsl mass erase cmd
	i2c_master_start(cmd); // send start condition
	i2c_master_write_byte(cmd, MSP430_BSL_ADDR << 1 | I2C_MASTER_READ, ACK_CHECK_EN); // slave address and read bit
	i2c_master_read(cmd, read, 8, I2C_MASTER_LAST_NACK); // read 
	i2c_master_stop(cmd); // send stop condition

	xSemaphoreTake(i2c_semaphore, portMAX_DELAY);
	i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 0);
	xSemaphoreGive(i2c_semaphore);

我还应该在 MSP430上为 BSL 设置什么其他设置吗?

或者、我的读取方法是否错误?

此致、

映军。

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

    这是设置 i2c 地址时出现的问题。

    由 ESP32设置的地址和 MSP430上的 i2c 从器件地址不匹配。

    此外,在跳转到 BSL 之后,我的代码调用 CS_clearAllOscFlagsWithTimeOut()函数,并且不离开循环。

    我解决了该问题、添加了 SFRIE1 &=~Ω OFIE。 (我禁用了中断、但我不知道为什么会遇到这些问题。)

    int main(void) {
    	// Stop watchdog timer
    	WDT_A_hold(WDT_A_BASE);
    	initClock(); // set MCLK to 8MHz
    
    	__disable_interrupt(); // disable interrupts
    	SFRIE1 &= ~OFIE; 
    	((void (*)())0x1000)(); // jump to BSL
    }