搜索
bottom↓
回复: 12

CYPRESS BLE学习心得(一):如何在使用CYPRESS BLE中的SFLash

[复制链接]

出0入0汤圆

发表于 2016-6-28 20:02:04 | 显示全部楼层 |阅读模式
本帖最后由 xiaolong_ba 于 2016-6-28 20:02 编辑

一、前言
        CYPRESS的PSOC BLE和PROC BLE芯片内部有个512Bytes的SFLash,用于保存用户指定的数据,接下来分享下如何对该区域进行读写。
二、SFLASH的内部结构


从上图可以看出,SFLASH共有4行,每行128Bytes,其中第0行的前6个字节是存放BLE的MAC地址用的,用户不能修改否则MAC地址就会被篡改了。同时,SFLASH地址从0x0FFF F200~0x0FFF F380.

三、写SFLASH的关键代码实现
        根据《cy_boot Component v5.30》手册的第8章所说,写SFLASH都是一次性写入128Bytes数据,不能一个Bytes一个Bytes地写入SFlash,但是我进行了相应的修改,一行可以在SFLASH地址范围指定的地方写入数据,代码如下:
1、使用到的宏定义:
/*****************************************************
*                  Enums and macros
*****************************************************/  
#define SWITCH_PRESSED                  (0u)   /* Active low user switch on BLE Pioneer kit */
#define USER_SFLASH_ROW_SIZE            (128u) /* SFlash row size for 128KB flash BLE device. For other PSoC 4 BLE devices
                                                * with higher flash size, this example project might need some modification.
                                                * Please check the device datasheet and TRM before using this code on non 128KB
                                                * flash devices */
#define SFLASH_STARTING_VALUE           (0x00) /* Starting value to be stored in user SFlash to demonstrate SFlash write API */
#define USER_SFLASH_ROWS                (4u)   /* Total number of user SFlash rows supported by the device */
#define USER_SFLASH_BASE_ADDRESS        (0x0FFFF200u) /* Starting address of user SFlash row for 128KB PSoC 4 BLE device */   
   
#define LOAD_FLASH                                         0x80000004
#define WRITE_USER_SFLASH_ROW                 0x80000018
#define USER_SFLASH_WRITE_SUCCESSFUL     0xA0000000     
2、关键代码的实现:
/*******************************************************************************
* Function Name: WriteUserSFlashRow
********************************************************************************
* Summary:
*        This routine calls the PSoC 4 BLE device supervisory ROM APIs to update
* the user configuration area of Supervisory Flash (SFlash).  
*
* Parameters:
*  userRowNUmber - User config SFlash row number to which data is to be written
*  dataPointer - Pointer to the data to be written. This API writes one row of
*                user config SFlash row at a time.
*
* Return:
*  uint32 - state of the user config SFlash write operation.
*
*******************************************************************************/
#if defined (__GNUC__)
#pragma GCC optimize ("O0")
#endif /* End of #if defined (__GNUC__) */
uint32 WriteUserSFlashRow(uint8 userRowNUmber, uint32 *dataPointer,uint8_t datalength,uint8_t address)
{
    uint8 localCount;
        volatile uint32 retValue=0;
//        volatile uint32 cmdDataBuffer[(CY_FLASH_SIZEOF_ROW/4) + 2];
    volatile uint32 cmdDataBuffer[datalength+2];
        volatile uint32 reg1,reg2,reg3,reg4,reg5,reg6;
       
        /* Store the clock settings temporarily */
    reg1 =        CY_GET_XTND_REG32((void CYFAR *)(CYREG_CLK_SELECT));
    reg2 =  CY_GET_XTND_REG32((void CYFAR *)(CYREG_CLK_IMO_CONFIG));
    reg3 =  CY_GET_XTND_REG32((void CYFAR *)(CYREG_PWR_BG_TRIM4));
    reg4 =  CY_GET_XTND_REG32((void CYFAR *)(CYREG_PWR_BG_TRIM5));
    reg5 =  CY_GET_XTND_REG32((void CYFAR *)(CYREG_CLK_IMO_TRIM1));
    reg6 =  CY_GET_XTND_REG32((void CYFAR *)(CYREG_CLK_IMO_TRIM2));
       
        /* Initialize the clock necessary for flash programming */
        CY_SET_REG32(CYREG_CPUSS_SYSARG, 0x0000e8b6);
        CY_SET_REG32(CYREG_CPUSS_SYSREQ, 0x80000015);
       
        /******* Initialize SRAM parameters for the LOAD FLASH command ******/
        /* byte 3 (i.e. 00) is the Macro_select */
        /* byte 2 (i.e. 00) is the Start addr of page latch */
        /* byte 1 (i.e. d7) is the key 2  */
        /* byte 0 (i.e. b6) is the key 1  */
          cmdDataBuffer[0]=0x0000d7b6|(address<<16);
        /****** Initialize SRAM parameters for the LOAD FLASH command ******/
        /* byte 3,2 and 1 are null */
        /* byte 0 (i.e. 7F) is the number of bytes to be written */
        cmdDataBuffer[1]=0x00000000|datalength-1;             
        /* Initialize the SRAM buffer with data bytes */
//    cmdDataBuffer[2] = *dataPointer;
    for(localCount = 0; localCount < datalength; localCount++)   
        {
                cmdDataBuffer[localCount + 2] = dataPointer[localCount];
        }
       
        /* Write the following to registers to execute a LOAD FLASH bytes */
        CY_SET_REG32(CYREG_CPUSS_SYSARG, &cmdDataBuffer[0]);
        CY_SET_REG32(CYREG_CPUSS_SYSREQ, LOAD_FLASH);
       
    /****** Initialize SRAM parameters for the WRITE ROW command ******/
        /* byte 3 & 2 are null */
        /* byte 1 (i.e. 0xeb) is the key 2  */
        /* byte 0 (i.e. 0xb6) is the key 1  */
        cmdDataBuffer[0] = 0x0000ebb6;
   
        /* byte 7,6 and 5 are null */
        /* byte 4 is desired SFlash user row
         * Allowed values 0 - row 4
                          1 - row 5
                                          2 - row 6
                                          3 - row 7 */
        cmdDataBuffer[1] = (uint32) userRowNUmber;
       
        /* Write the following to registers to execute a WRITE USER SFlash ROW command */
        CY_SET_REG32(CYREG_CPUSS_SYSARG, &cmdDataBuffer[0]);
        CY_SET_REG32(CYREG_CPUSS_SYSREQ, WRITE_USER_SFLASH_ROW);
   
        /* Read back SYSARG for the result. 0xA0000000 = SUCCESS; */
        retValue = CY_GET_REG32(CYREG_CPUSS_SYSARG);
       
        /* Restore the clock settings after the flash programming is done */
    CY_SET_XTND_REG32((void CYFAR *)(CYREG_CLK_SELECT),reg1);
    CY_SET_XTND_REG32((void CYFAR *)(CYREG_CLK_IMO_CONFIG),reg2);
    CY_SET_XTND_REG32((void CYFAR *)(CYREG_PWR_BG_TRIM4),reg3);
    CY_SET_XTND_REG32((void CYFAR *)(CYREG_PWR_BG_TRIM5),reg4);
    CY_SET_XTND_REG32((void CYFAR *)(CYREG_CLK_IMO_TRIM1),reg5);
    CY_SET_XTND_REG32((void CYFAR *)(CYREG_CLK_IMO_TRIM2),reg6);  
       
        return retValue;
}
#if defined (__GNUC__)
#pragma GCC reset_options
#endif /* End of #if defined (__GNUC__) */
三、读SFLASH的内容
        直接读x0FFF F200~0x0FFF F380地址的内容即可,代码实现如下:
/*******************************************************************************
* Function Name: ReadDataFromSFlash
********************************************************************************
*
*
*
*  读取SFlash中的数据
* \param  none
* \return
*  None
*       SFlash中有506Bytes字节的用户可配置的空间
******************************************************************************/
uint8_t ReadDataFromSFlash()
{
   
    uint8_t FlashData=0;
    uint8_t *sflashPtr=(uint8_t *)USER_SFLASH_BASE_ADDRESS;//SFlash的首地址
    sflashPtr=sflashPtr+6;//前6字节是保存MAC地址,不能修改
    FlashData=*sflashPtr;
    return FlashData;   
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-6-28 22:02:01 | 显示全部楼层
感谢楼主分享

出0入54汤圆

发表于 2016-6-28 22:44:33 | 显示全部楼层
牛逼啊,哈哈,现在原创不多了

出0入0汤圆

 楼主| 发表于 2016-6-29 09:04:00 | 显示全部楼层

不客气,有啥不对的地方,欢迎指出

出0入0汤圆

 楼主| 发表于 2016-6-29 09:04:21 | 显示全部楼层
mutoudonggua 发表于 2016-6-28 22:44
牛逼啊,哈哈,现在原创不多了

就是一些简单的配置,没啥的

出0入0汤圆

发表于 2016-7-16 13:34:51 | 显示全部楼层
感謝樓主分享

出0入0汤圆

发表于 2016-8-18 20:15:57 | 显示全部楼层
我刚刚拿到一个这个板子,想请教下这个应用广吗?对以后发展有帮助没

出0入0汤圆

 楼主| 发表于 2016-8-22 11:17:03 | 显示全部楼层
小红花 发表于 2016-8-18 20:15
我刚刚拿到一个这个板子,想请教下这个应用广吗?对以后发展有帮助没

看你的产品定位,适合自已产品的就有帮助,不适合就没帮助

出0入0汤圆

发表于 2016-9-1 10:01:21 | 显示全部楼层
xiaolong_ba 发表于 2016-8-22 11:17
看你的产品定位,适合自已产品的就有帮助,不适合就没帮助

说的很有道理,但是我是在自学,这个和STM32相比较,哪个学了更有用?

出0入0汤圆

 楼主| 发表于 2016-9-2 09:01:21 | 显示全部楼层
小红花 发表于 2016-9-1 10:01
说的很有道理,但是我是在自学,这个和STM32相比较,哪个学了更有用?

个人还是觉得BLE更有用一点

出0入0汤圆

发表于 2016-11-6 19:50:06 | 显示全部楼层
楼主能否写一下cy BLE 和 CC2640 nRF51822的优劣啊?

出0入0汤圆

 楼主| 发表于 2016-11-6 21:21:52 | 显示全部楼层
feiban001 发表于 2016-11-6 19:50
楼主能否写一下cy BLE 和 CC2640 nRF51822的优劣啊?

1、CY BLE的集成度比较高,集成运放,触摸,屏驱,但是CY入市比较慢,很多市场被抢占,加上CY的东西给人的印象都是比较贵,而且Nordic、TI、Dialog等在市场多年的耕耘以及工程师大多都已经习惯这些厂商的芯片了,所以用得人并不多,遇到问题发现很多时候会找不到路了,但是官方的资料还是挺多的。
2、TI的CC2640这个BLE算是废掉的一代了,flash空间太小如果代码很大的话要慎重,软件的机制使得入门难度高,得益于TI的品牌知名度,所以还是有一些人使用的,但是据我周围所认识的人及代理商的反馈,几乎是差评。只能等等看看下一代了。
3、Nordic的51822可以说抢占了BLE的很多市场份额,用得人也超级多,一方面Nordic的确是一家认真在做事的公司,另一方面这个芯片使用起来非常舒服好用且稳定,遇到问题基本上一搜索即可找到答案,即使价格可能会贵一点点,但是还是很受嵌入式工程师的青睐。

总结:优劣这个是相对来说的,只要适合自己的产品那么这个这个芯片就有优势,以下附件是是CY BLE跟其他的对比图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2017-1-1 23:06:06 | 显示全部楼层
谢谢楼主分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 15:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表