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.

[参考译文] CC2642R-Q1:片外 OAD

Guru**** 2589300 points
Other Parts Discussed in Thread: CC2642R-Q1, CC2642R

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1370301/cc2642r-q1-off-chip-oad

器件型号:CC2642R-Q1
主题中讨论的其他器件: CC2642R

工具与软件:

下午好、

我将在 cc2642上部署备份工厂映像。 
我想将一个 OAD 工厂映像保存到外部闪存中。 
我只能从地址0x00读取。 
然后、我最终会生成一个 error_spin。 
我是否必须在某处转换某个位、因为它是受保护的存储器? 
带适用于 MX25的 NVS 驱动程序的 OAD 出厂映像确实可以工作 
谁可以帮助我 
代码如下所述 


------------------
spiflash.c

int8_t spiflash_Write (uint32_t addr、void*buffer、size_t buffersize)
{
uint8_t * srcBuf;
size_t lenBuf、lenWrite、lenDone;
uint8_t wbuf[4];
int8_t status = true;
int retval = 0;

/*验证地址和长度*/
//if (offset + buffersize > hwAttrs->regionSize)
//{
//返回(NVS_STATUS_INV_OFFSET);
//}

srcBuf =缓冲器;
lenBuf =缓冲器大小;
长度= 0;

while (lenBuf > 0)
{
/*等待前一个擦除/编程操作完成*/
int8_t ret = spiflash_waitReady ();
IF (RET)
{
状态= false;
中断;

REt = spiflash_command (CMD_WREN);
IF (RET)
{
状态= false;
中断;

wbuf[0]= CMD_PP;
wbuf[1]=((addr + lenDone)>> 16)和0xff;
wbuf[2]=((addr + lenDone)>> 8)& 0xff;
wbuf[3]=(addr + lenDone)& 0xff;

lenWrite = SPIFLASH_program_page_size -((addr + lenDone)% SPIFLASH_program_page_size);
if (lenBuf < lenWrite)
{
lenWrite = lenBuf;

spriflashAssert();
如果(spiflash_write (wbuf、sizeof (wbuf))!= 0)
{
状态= false;
中断;

如果(spiflash_write (srcBuf、lenWrite)!= 0)
{
状态= false;
中断;

spiflashDeassert();

srcBuf += lenWrite;
lenDone += lenWrite;
lenBuf—= lenWrite;

if (status == false)
{
RetVal =-1;

返回(返修);



静态 int8_t spiflash_write (const uint8_t * data、size_t length)
{
返回(fxP457->write(buffer, Spi_Flash buffersize);

------------------

SPI.c  

静态 int8_t spi0_write (const uint8_t * data、size_t length)
{
SPI_Transaction spiTransaction;
spiTransaction.rxBuf = NULL;

/*解决 SPI 从地址0x0传输的问题,从本地缓冲区传输第一个字节*/
IF (DATA = NULL)
{
uint8_t byte0 =*数据;
spiTransaction.count = 1;
spiTransaction.txBuf =(void *)&byte0;
如果(! SPI_TRANSMIT (spiHandle、&spiTransaction)
{
WARNS_SET (SPI_FAILED);
返回 SPI_ERROR;

Data++;
长度--;
如果(长度=0)
{
返回 spi_suces;

spiTransaction.count =长度;
spiTransaction.txBuf =(void *) data;

if (! SPI_TRANSMIT (spiHandle、&spiTransaction)
{
WARNS_SET (SPI_FAILED);
返回 SPI_ERROR;

返回 spi_suces;