微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > CC2530 program flash

CC2530 program flash

时间:10-02 整理:3721RD 点击:

在做CC2530烧录的时候需要用到如下函数:

void write_flash_memory_block(unsigned char *src, unsigned long start_addr,
unsigned short num_bytes)
{
u8 retry = 0;
unsigned char len[2];
len[0] = HIBYTE(num_bytes);
len[1] = LOBYTE(num_bytes);
//log("write_flash_memory_block\n");
// 1. Write the 2 DMA descriptors to RAM
write_xdata_memory_block(ADDR_DMA_DESC_0, dma_desc_0, 8);
write_xdata_memory_block(ADDR_DMA_DESC_1, dma_desc_1, 8);

// 2. Update LEN value in DUP's DMA descriptors
write_xdata_memory_block((ADDR_DMA_DESC_0+4), len, 2); // LEN, DBG => ram
write_xdata_memory_block((ADDR_DMA_DESC_1+4), len, 2); // LEN, ram => flash

// 3. Set DMA controller pointer to the DMA descriptors
write_xdata_memory(DUP_DMA0CFGH, HIBYTE(ADDR_DMA_DESC_0));
write_xdata_memory(DUP_DMA0CFGL, LOBYTE(ADDR_DMA_DESC_0));
write_xdata_memory(DUP_DMA1CFGH, HIBYTE(ADDR_DMA_DESC_1));
write_xdata_memory(DUP_DMA1CFGL, LOBYTE(ADDR_DMA_DESC_1));

// 4. Set Flash controller start address (wants 16MSb of 18 bit address)
write_xdata_memory(DUP_FADDRH, HIBYTE( (start_addr>>2) ));
write_xdata_memory(DUP_FADDRL, LOBYTE( (start_addr>>2) ));

// 5. Arm DBG=>buffer DMA channel and start burst write
write_xdata_memory(DUP_DMAARM, CH_DBG_TO_BUF0);
burst_write_block(src, num_bytes);

// 6. Start programming: buffer to flash
write_xdata_memory(DUP_DMAARM, CH_BUF0_TO_FLASH);
write_xdata_memory(DUP_FCTL, 0x06);

// 7. Wait until flash controller is done
while (read_xdata_memory(DUP_FCTL) & 0x80);

}

发现该函数只能烧录【0x0000 -- 0x7FFF】地址的内容,start_addr超过该范围后超出部分的内容烧录不进,不知道写到内部什么地方去了。

但是datasheet中描述 DUP_FADDR的地址是32位的,这里为什么只有15位有效?

如果我要烧录的文件大于32kB(地址超出0x7FFF),超出的部分要如何烧录?

有没有类似读falsh的函数:

void read_flash_memory_block(unsigned char bank,unsigned short flash_addr,
unsigned short num_bytes, unsigned char *values)
{
unsigned char instr[3];
unsigned short i;
unsigned short xdata_addr = (0x8000 + flash_addr);
//log("read_flash_memory_block\n");

// 1. Map flash memory bank to XDATA address 0x8000-0xFFFF
write_xdata_memory(DUP_MEMCTR, bank);

// 2. Move data pointer to XDATA address (MOV DPTR, xdata_addr)
instr[0] = 0x90;
instr[1] = HIBYTE(xdata_addr);
instr[2] = LOBYTE(xdata_addr);
debug_command(CMD_DEBUG_INSTR_3B, instr, 3);

for (i = 0; i < num_bytes; i++)
{
// 3. Move value pointed to by DPTR to accumulator (MOVX A, @DPTR)
instr[0] = 0xE0;
values[i] = debug_command(CMD_DEBUG_INSTR_1B, instr, 1);

// 4. Increment data pointer (INC DPTR)
instr[0] = 0xA3;
debug_command(CMD_DEBUG_INSTR_1B, instr, 1);
}
}

可以指定内部bank来写?

应该可以的,根据技术手册上面提到了这个Bank是可以指定的。不过每一块的作用有所不同。

 问题已经解决,addr 和num都要能被4整除

你好。请问一下,你做的是CC2530的下载器吗,请问哪里有相关资料,谢谢

某宝搜索cc2530离线烧写器,有现成的

你好!请问你用函数将程序烧到flash之后,cc2530可以工作吗?我现在也使用这种方式烧录程序,但是程序写进去之后芯片还是不能工作。是不是我写入的起始地址不对呢?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top