Thread 中讨论的其他器件:BLE-STACK
工具/软件:TI-RTOS
CC2640R2定制4x4电路板、simplelink_cc2640r2_sdk_1_35_00_33、XDS200调试器。
使用 simple_peripheral 项目成功地从 BLE_SDK_2_02_01_18移植了该项目。 要使用 API 与外部闪存通信,请将 ExtFlash.c 和 ExtFlash.h 链接到应用程序。 使用了 FlashROM 构建配置。
CC2640R2定制板上移植的项目通过 UART 广播、连接并可与外部处理器通信、如果未使用外部闪存、则在移植后待机电流消耗不会改变。
当定制板配置为使用外部闪存时、CC2640R2在访问外部闪存后不会进入待机状态。 当 ble_sdk_2_02_01_18项目使用外部闪存时、待机电流消耗约为50uA、表示外部闪存可能未按预期断电。 待机电流消耗高于理想值、但稳定。 使用 CC2640R2板时、系统在访问外部闪存后完全不满意。 仪表指示电流过流的频率比通告间隔要高得多。
在外部闪存访问后、移植是否会导致此电流过载?
移植前后使用相同的中间件文件。
2. 从外部闪存读取后会发出通知。 这将调用 GATT_notification。 每小时有一个到外部闪存的写入。 在此期间不发送任何通知。 但是、第一次写入(一小时后)是系统停止进入待机状态的时候。
我已附上应用程序用于在两个 SPI 从器件之间进行选择的代码。
SPI 从器件1选择
void ACAM_RESUME (void)
{
SPI = SPI_OPEN (CC2640R2_Custom_SPI0、&spiParams);
if (SPI == NULL){
System_printf ("\n 打开 SPI"时出错);
}
PIN_ID csnPin1 = PIN_ID (Board_ACSN);
SPI_CONTROL (SPI、SPICC26XXDMA_SET_CSn_PIN、&csnPin1);
acamEnabled = 1;
}
SPI 从器件2选择(外部闪存)
中间件使用 PIN API 来选择外部闪存。 为了避免 SPI_CONTROL API 干扰这一点、在 ExtFlash.c 中添加了以下两行:
静态 PIN_ID csnPin = PIN_ID (PIN_Unassigned);
静态 bool SPI_open (uint32_t 比特率){
/*禁用驱动程序芯片选择功能。 这由处理
* extFlashSelect 和 extFlashDeselect 方法*/
SPI_CONTRATION( spiHandle、SPICC26XXDMA_SET_CSn_PIN、&csnPin );
}
在 SBP 周期事件期间、每小时写入一次外部闪存。 以下是该代码:
静态空 SimpleBLEPeripheral_performPeriodicTask (空)
{
#ifndef Feature_OAD
TIMESTAMP++;
如果(时间戳% 720 = 0){ // 5秒间隔(720 = 1小时)
ACAM_SUSPEND ();
//写入趋势值。
if (ExtFlash_open())
{
uint8_t 数据记录[data_log_length];
dataalog[0]=(uint8_t)(时间戳和0x000000ff);
dataalog[1]=(uint8_t)((时间戳和0x0000ff00)>> 8);
dataalog[2]=(uint8_t)((时间戳和0x00ff0000)>> 16);
dataalog[3]=(uint8_t)((时间戳和0x000000)>> 24);
dataalog[4]=(uint8_t)(calc_prsAdvMode 和0x0000ff);
dataalog[5]=(uint8_t)((calc_prsAdvMode 和0x00ff00)>> 8);
dataalog[6]=(uint8_t)((calc_prsAdvMode & 0x0000)>> 16);
dataalog[7]=(uint8_t)(温度和0x00ff);
datalog[8]=(uint8_t)((温度和0x0000)>> 8);
//存储标准趋势值。
if (趋势<= MAX_TRENDS)
{
uint8_t addr = data_log_length *趋势;
if (addr % EXT_FLASH_PAGE_SIZE = 0){
ExtFlash_erase (addr、EXT_FLASH_PAGE_SIZE);
}
if (ExtFlash_write (addr、data_log_length、datalog))
{
趋势++;
}
其他
{
故障++;
}
}
//检查是否处于报警状态并存储趋势值。
if (status!= STATUS_OK && alarmTrends <= MAX_TRENDS)
{
uint8_t addr =(data_log_length * alarmTrends)+(MAX_TRENDS * data_log_length);
if (addr % EXT_FLASH_PAGE_SIZE = 0){
ExtFlash_erase (addr、EXT_FLASH_PAGE_SIZE);
}
if (ExtFlash_write (addr、data_log_length、datalog))
{
alarmTrends++;
}
否则{
故障++;
}
}
}
ExtFlash_Close ();
ACAM_RESUE();
uint8时间戳[TIMESTAMP_RANGE_LENGTH];
IttDeviceData_GetParameter (ITT_PRS_TIMESTAMP_RCV、时间戳);
//更新开始和结束时间戳值。
//检查是否设置了启动时间戳。
如果(时间戳[0]= 0x00
&&时间戳[1]= 0x00
&&时间戳[2]=0x00
&&时间戳[3]= 0x00)
{
memcpy (×tamp、×tamp、4);
}
其他
{
//否则设置最新的结束时间戳。
memcpy (×tamp[4]、×tamp、4);
}
IttDeviceData_SetParameter (ITT_PRS_TIMESTAMP_RCV、TIMESTAMP_RANGE_LENGTH、时间戳);
uint8 itPrsAlarmTimeTrend[TIMESTAMP_RANGE_LENGTH];
IttDeviceData_GetParameter (ITT_PRS_ALARM_TIME_TREND、itPrsAlarmTimeTrend);
//检查是否设置了启动时间戳。
if (itPrsAlarmTimeTrend[0]= 0x00
&& itPrsAlarmTimeTrend[1]= 0x00
&& itPrsAlarmTimeTrend[2]= 0x00
&& itPrsAlarmTimeTrend[3]= 0x00)
{
memcpy (&ittPrsAlarmTimeTrend、×tamp、4);
}
其他
{
//否则设置最新的结束时间戳。
memcpy (&ittPrsAlarmTimeTrend[4]、×tamp、4);
}
IttDeviceData_SetParameter (ITT_PRS_ALARM_TIME_TREND、TIMESTAMP_RANGE_LENGTH、itPrsAlarmTimeTrend);
}
#endif //!Feature_OAD
}