主题中讨论的其他器件:CC1310
我想 在把 cmd 后再使用 cc1310 SPI 接收到的数据发送到 RFcore 后、但当我在把 postcmd 后使用 SPI 时、程序好像一直在 faultISR 中、如何解决?
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.
我想 在把 cmd 后再使用 cc1310 SPI 接收到的数据发送到 RFcore 后、但当我在把 postcmd 后使用 SPI 时、程序好像一直在 faultISR 中、如何解决?
void RfSetupState_function()
{
RF_Params rfParams;
rf_params_init (&rfParams);
if (RFQueue_defineQueue (RFQueue_Rx、
&dataQueue[RFQueue_Rx],
rxDataEntryBuffer、
sizeof (rxDataEntryBuffer)、
num_data_entries、
max_RX_length + num_added_bytes){
/*无法为所有数据条目分配空间*/
while (true);
}
if (RFQueue_defineQueue (RFQueue_Tx、
&dataQueue[RFQueue_Tx]、
txDataEntryBuffer、
sizeof (txDataEntryBuffer)、
num_data_entries、
max_tx_length + num_added_bytes){
/*无法为所有数据条目分配空间*/
while (true);
}
//设置高速 Tx 命令
rf_cmdTxHS.pQueue =&dataQueue[RFQueue_Tx];
rf_cmdTxHS.startTrigg.triggerType = TRIG_ABSTIME;
rf_cmdTxHS.startTrigger.pastTrig = 1;
RF_cmdTxHS.StartTime = 0;
rf_cmdTxHs.pktConf.bFsOff = false;
rf_cmdTxHs.pktConf.bUseCrc = true;
rf_cmdTxHs.pktConf.bVarLen = true;
rf_cmdTxHs.pktConf.bCheckQAtEnd = false;
//设置高速 Rx 命令
rf_cmdRxHS.pOutput =&rxStatistic_hs;
rf_cmdRxHS.pQueue =&dataQueue[RFQueue_rx];
RF_cmdRxHS.maxPktLen = MAX_RX_LENGTH;
rf_cmdRxHS.pktConf.bFsOff = false;//在执行命令后保持频率同步*/
rf_cmdRxHS.pktConf.bUseCrc = true;/*接收和检查 CRC */
rf_cmdRxHS.pktConf.bVarLen = true;/*可变长度*/
RF_cmdRxHS.pktConf.bRepeatOk = false;//接收单个有效数据包后停止*/
rf_cmdRxHS.pktConf.bRepeatNok = true;//接收到包含 CRC 错误的数据包后返回同步搜索*/
rf_cmdRxHS.rxConf.bAutoFlushCrcErr = true;//从 Rx 队列中丢弃具有 CRC 错误的数据包*/
rf_cmdRxHS.rxConf.bIncludeLen = true;/*在存储的数据包中包含接收到的长度字段*/
rf_cmdRxHS.rxConf.bIncludeCrc = false;//在存储的数据包中排除接收到的 CRC 字段*/
rf_cmdRxHS.rxConf.bAppendStatus = false;/* Rx 队列中的数据包没有附加的状态字*/
rf_cmdRxHS.rxConf.bAppendTimestamp = true;/*将 RX 时间戳添加到数据包有效载荷中*/
RF_cmdRadioSetup_hsm.config.frontEndMode = 0x00;
/*请求访问对讲机。 这不会给射频内核上电、但只会初始化
*驱动程序并缓存 setup 命令。 */
rfHandle = rf_open (&rfObject、&rf_prop_HSM、(RF_RadioSetup*)&RF_cmdRadioSetup_HSM、&rfParams);
if (rfHandle == NULL){
while (true);
}
/*设置频率。 现在射频驱动程序为射频内核供电并从上面运行设置命令。
*当 RF 驱动程序进行自动执行时,会执行 FS 命令并缓存以供以后使用
*加电。 */
RF_EventMask 结果= RF_runCmd (rfHandle、(RF_Op*)和 RF_cmdFS、RF_PriorityNormal、NULL、0);
if (((result != RF_EventLastCmdDone)||(volatile RF_Op*)&RF_cmdFS)->status != DONE_OK){
while (true);
}
if (pAppCallbacks!= NULL){
// pA 信号设置
if (pAppCallbacks->appOnPaSetup != NULL){
pAppCallback->appOnPaSetup();
}
// LNA 信号设置
if (pAppCallbacks->appOnLnaSetup != NULL){
pAppCallback->appOnLnaSetup();
}
}
#if 已定义(APP_TX_ROLE)
/*使用当前时间作为未来时间戳的锚点。 */
RF_cmdNop.StartTime = RF_getCurrentTime ();
StateMachine_setNextState (&stateMachine、BeaconRequestCcState);
#Elif 已定义(APP_RX_ROLE)
StateMachine_setNextState (&stateMachine、RxPacketState);
#endif
}
void RF_TEST_TX (void)
{
rf_cmdNop.startTrigger.triggerType = TRIG_ABSTIME;//Trigs (在绝对时间)
rf_cmdNop.startTrigger.pastTrig = 1;
/*设置命令链的下一个指针*/
rf_cmdNop.pNextOp =(RFC_RADIOP_t*)&RF_cmdTxHS;
// TODO:添加 CS
// GPIO_WRITE (Board_GPIO_RLED、Board_GPIO_LED_OFF);//
/*自定义 CMD_HS_TX 命令*/
{
uint16_t pktLength;
uint8_t * pPacket;
currentDataEntry[RFQueue_Tx]= RFQueue_getDataEntry (RFQueue_Tx);
RFQueue_nextEntry (RFQueue_Tx);
pPacket = currentDataEntry [RFQueue_Tx]->data;
pktLength = sizeof (BeaconReqPkt_t);
currentDataEntry[RFQueue_Tx]->length = pktLength;
__attribute__((unused)) BeaconReqPkt_t * pBeaconReqPkt =(BeaconReqPkt_t *) pPacket;
PktHeader_t *pPktHeader =(PktHeader_t *) pPacket;
pPktHeader->length = pktLength;
pPktHeader->destination = APP_DST_ADDR;
pPktHeader->type = APP_packet_type_beacon_REQ;
pPktHeader->PCB.b = 0;
pPktHeader->PCB.b 需要= true;
pPktHeader->pcb.seqNum = seqNumber;
}
rf_cmdTxHS.pQueue =&dataQueue[RFQueue_Tx];
rf_cmdTxHs.startTrigg.triggerType = trig_now;
RF_cmdTxHS.condition.rule = COND_ALWAYS;
rf_cmdTxHS.pNextOP =(RFC_RADIOP_t*)&RF_cmdRxHS;
/*自定义 CMD_HS_RX 命令*/
rf_cmdRxHS.pQueue =&dataQueue[RFQueue_rx];
rf_cmdRxHs.startTrigg.triggerType = trig_now;
RF_cmdRxHS.condition.rule = COND_STOP_ON_TRUE;
RF_cmdRxHS.endTrigger.triggerType = TRIG_REL_START;
RF_cmdRxHS.EndTime = APP_RX_TIMEOUT;
rf_cmdRxHS.pNextOP =(RFC_radioOp_t*)与 RF_cmdCountBranch;
/*未接收到应答、执行固定时间重试*//分支跳转tx
/*自定义 CMD_COUNT_BRANCH 命令*/
RF_cmdCountBranch.counter = 1+2;//总发送时间,必须设置为大于1
rf_cmdCountBranch.pNextOp = 0;
RF_cmdCountBranch.pNextOpIfOk =(RFC_RADIOP_t*)&RF_cmdTxHS;
logInfo ("信标");
// GPIO_WRITE (BOARD_GPIO_GLED、BOARD_GPIO_LED_ON);
/*发送数据包*/
RF_cmdNop.StartTime += RF_convertMsToRatTicks (1);//1s 间隔发送beacon
RF_postCmd (rfHandle、(RF_Op*)和 RF_cmdNop、RF_PriorityNormal、
&CcCallback、RF_EventTxDone |RF_EventTxEntryDone| RF_EventRxEntryDone);//注册RF _EventTxEntryDone
}
uint8_t SPI_send_img (void)
{
uint8_t flag=0;
uint8_t cnt=6;
PIN_setOutputValue (pinHandle、CC1310_LAUNCHXL_DIO5、0);//µ 低电平拍照状态
spiTransStatus =-1;
InitAll_SPI (spiQueue、2900);// TODO:更改图像大小
// spi_send (spiQueue、2900);
PIN_setOutputValue (pinHandle、CC1310_LAUNCHXL_DIO5、1);//µ 低电平拍照状态
usleep(6*1000);
// CPUdelay(12000*6);
PIN_setOutputValue (pinHandle、CC1310_LAUNCHXL_DIO5、0);//µ 低电平拍照状态
if (spiTransStatus!=-1)
// if (spiTransStatus ==SPI_TRANSMIT_completed)
{
//logHex ("SS Rx:"、6、spiQueue);
标志=1;
}
否则
{
SPI_transferCancel (spiHandle);
}
// Power_releaseConstraint (PowerCC26XX_disallow _idle);
SPI_Close (spiHandle);
返回标志;
}
静态 void InitAll_SPI (uint8_t * rxBuffer、size_t maxLength)
{
Bool transferOK;
静态 uint8_t packtnum=0;
SPI_INIT();
SPI_PARAMS_INIT (&spiParams);
spiParams.dataSize = 8;// 8位数据大小
spiParams.bitrate = 4000000;
spiParams.frameFormat = SPI_POL1_PHA1;
spiParams.mode = SPI_SLAVE;
spiParams.transferMode = SPI_MODE_CALLBACK;
spiParams.transferCallbackFxn = transferCompleteFxn;
//打开 SPI 并执行传输
spiHandle = SPI_open (Board_SPI_SLAVE、&spiParams);
if (spiHandle == NULL){
while (1);// spi_open ()失败
}
// SPI_CONTROL (spiHandle、SPICC26XXDMA_RETURN_PARTIAL_ENABLE、NULL);
// SPI_CONTROL (spiHandle、SPICC26XXDMA_SET_CSN_PIN、NULL);
//配置事务
spiTransaction.count = maxLength;
spiTransaction.txBuf = NULL;
spiTransaction.rxBuf = rxBuffer;
transferOK=SPI_TRANSMIT (spiHandle、&spiTransaction);
}
//void mainthread ()
// RfSetupState_function();
// while (1)
//{
// rf_test_tx ();
// usleep(1000);
// if (spi_send_img ())
//{
//// logInfo ("spi rx:%x|%x|%x|%x"、spiQueue[0]、spiQueue[1]、spiQueue[2]、spiQueue[3]);
// logHex ("SS Rx:"、6、spiQueue);
// logInfo ("s.k");
//}
//
//}
}
您没有提供完整的示例供我们测试、因此我无法告诉您正在发生什么。
我看不到您的代码中有任何错误处理、也不知道您的回调中会发生什么情况。
你做了很多事情会把事情弄得一团糟:命令链、分支、命令的不同启动触发器等。
您是否已验证如果未使用 SPI、无线电的一切功能是否按预期正常工作?
您使用的是高速模式并在从模式下使用 SPI、因此您无法控制 SPI 上的情况何时发生。 当对讲机收到数据包时、如果您的应用被回调占用该怎么办。 您是否能够足够快地清空缓冲区以避免溢出?
当代码被卡住以确定对讲机发生了什么情况时、您是否检查了所有对讲机命令的状态?
您还应该尝试在运行代码以及 SPI 总线的同时从无线电输出 Pa 和 LNA 信号。 监控无线电和 SPI 上发生的情况可以帮助您确定何时/发生了什么故障。
Siri