в моем проекте мне нужно подключить через UART PIC32MZ2048EFH144 и внешнее устройство. Я установил периферийное устройство USART таким образом, используя Harmony v1.1:
CONFIG_USE_DRV_USART=y
CONFIG_DRV_USART_DRIVER_MODE="STATIC"
CONFIG_DRV_USART_INTERRUPT_MODE=y
CONFIG_DRV_USART_BYTE_MODEL_SUPPORT=n
CONFIG_DRV_USART_READ_WRITE_MODEL_SUPPORT=n
CONFIG_DRV_USART_BUFFER_QUEUE_SUPPORT=y
CONFIG_DRV_USART_SUPPORT_TRANSMIT_DMA=n
CONFIG_DRV_USART_SUPPORT_RECEIVE_DMA=n
CONFIG_DRV_USART_INSTANCES_NUMBER=2
CONFIG_DRV_USART_CLIENTS_NUMBER=2
CONFIG_DRV_USART_PERIPHERAL_ID_IDX1="USART_ID_4"
CONFIG_DRV_USART_BAUD_RATE_IDX1=9600
CONFIG_DRV_USART_XMIT_INT_PRIORITY_IDX1="INT_PRIORITY_LEVEL1"
CONFIG_DRV_USART_XMIT_INT_SUB_PRIORITY_IDX1="INT_SUBPRIORITY_LEVEL0"
CONFIG_DRV_USART_RCV_INT_PRIORITY_IDX1="INT_PRIORITY_LEVEL1"
CONFIG_DRV_USART_RCV_INT_SUB_PRIORITY_IDX1="INT_SUBPRIORITY_LEVEL0"
CONFIG_DRV_USART_ERR_INT_PRIORITY_IDX1="INT_PRIORITY_LEVEL1"
CONFIG_DRV_USART_ERR_INT_SUB_PRIORITY_IDX1="INT_SUBPRIORITY_LEVEL0"
CONFIG_DRV_USART_OPER_MODE_IDX1="DRV_USART_OPERATION_MODE_NORMAL"
CONFIG_DRV_USART_INIT_FLAG_WAKE_ON_START_IDX1=n
CONFIG_DRV_USART_INIT_FLAG_AUTO_BAUD_IDX1=n
CONFIG_DRV_USART_INIT_FLAG_STOP_IN_IDLE_IDX1=n
CONFIG_DRV_USART_LINE_CNTRL_IDX1="DRV_USART_LINE_CONTROL_8NONE1"
CONFIG_DRV_USART_HANDSHAKE_MODE_IDX1="DRV_USART_HANDSHAKE_NONE"
CONFIG_DRV_USART_XMIT_QUEUE_SIZE_IDX1=10
CONFIG_DRV_USART_RCV_QUEUE_SIZE_IDX1=10
CONFIG_DRV_USART_STATIC_RX_MODES_IDX1="USART_HANDSHAKE_MODE_FLOW_CONTROL"
CONFIG_DRV_USART_STATIC_OP_MODES_IDX1="USART_ENABLE_TX_RX_USED"
CONFIG_DRV_USART_STATIC_LINECONTROL_MODES_IDX1="USART_8N1"
CONFIG_DRV_USART_STATIC_TX_ENABLE_IDX1=y
CONFIG_DRV_USART_STATIC_RX_ENABLE_IDX1=y
CONFIG_DRV_USART_STATIC_TX_INTR_MODES_IDX1="USART_TRANSMIT_FIFO_NOT_FULL"
CONFIG_DRV_USART_STATIC_RX_INTR_MODES_IDX1="USART_RECEIVE_FIFO_ONE_CHAR"
В начале внешнее устройство отправляет сообщение пробуждения, которое я правильно получаю и отвечаю подтверждением пробуждения. После этой последовательности я отправляю requestDevID... в этот момент у меня возникают проблемы. Через осциллограф я вижу, что внешнее устройство правильно отвечает на этот запрос, но в моем коде я не получаю всего сообщения.
Ответ: 0xFA 0xFF 0x01 0x04 0x07 0x78 0x26 0x1A 0x3D Что я вижу (когда останавливаю отладку): 0x78 0x26 0x1A 0x3D 0x07
Мой код выглядит следующим образом:
void mti710USART1BufferHandler(DRV_USART_BUFFER_EVENT bufferEvent, DRV_USART_BUFFER_HANDLE hBufferEvent, uintptr_t context){
switch(bufferEvent){
case DRV_USART_BUFFER_EVENT_COMPLETE:{
if (context == 1){
// to-do
flag = 1;
countFlag += 1;
}
break;
case DRV_USART_BUFFER_EVENT_ERROR:{
if (context == 1){
// to-do
flag = -1;
}
}
break;
case DRV_USART_BUFFER_EVENT_ABORT:
break;
default:
break;
}
}
bool mti710Initialize(MTi710INSInitDriver_t mti710Init){
mtiData.dvrMTi710INSIndex = mti710Init.dvrMTi710INSIndex;
mtiData.drvUART.handle = DRV_HANDLE_INVALID;
mtiData.drvUART.baudrate = 115200;
memset(&mtiData.drvUART.TX.buffer, 0x00, sizeof(mtiData.drvUART.TX.buffer));
memset(&mtiData.drvUART.RX.buffer, 0x00, sizeof(mtiData.drvUART.RX.buffer));
mtiData.drvUART.handle = DRV_USART_Open(mtiData.dvrMTi710INSIndex, DRV_IO_INTENT_READWRITE | DRV_IO_INTENT_NONBLOCKING);
if (mtiData.drvUART.handle != DRV_HANDLE_INVALID) {
if (mti710SetBaudrate(mtiData.drvUART.handle, mtiData.drvUART.baudrate)){
DRV_USART_BufferEventHandlerSet(mtiData.drvUART.handle, mti710USART1BufferHandler, (uintptr_t) 1);
mtiData.drvMti710INSState = MTi710INS_STATE_IDLE;
return true;
}
}
return false;
}
static void UARTRead(uint8_t* readBuffer, uint32_t bufferSize){
USART_ReceiverOverrunErrorClear_Default(DRV_USART_INDEX_1);
while (DRV_USART_ClientStatus(mtiData.drvUART.handle) != DRV_USART_CLIENT_STATUS_READY);
DRV_USART_BufferAddRead(mtiData.drvUART.handle, &(mtiData.drvUART.RX.bufferHandle), readBuffer, bufferSize);
}
...
...
uint32_t mti710ReadDeviceID(struct XbusParser* parser, const uint32_t timeout_us){
struct XbusMessage requestId = {XMID_ReqDid, 0, NULL};
mtiData.drvMti710INSState = MTi710INS_REQ_READ_ID;
if (flag == 0){
mti710WriteData(&requestId);
flag = 0;
}
mti710ReadData(9);
if (flag == 1){
XbusParser_parseBuffer(parser, (uint8_t*)&mtiData.drvUART.RX.buffer[0], sizeof(mtiData.drvUART.RX.buffer));
flag = 0;
return parser->currentMessage.mid == XMID_DeviceId ? (uint32_t)parser->currentMessage.data : -1;
} else {
return -1;
}
}
Есть идеи о моих ошибках?
С уважением,
Винченцо.