在线时间2231 小时
UID3253523
注册时间2016-3-21
NXP金币3655
该用户从未签到
超级版主
 
- 积分
- 25450
- 最后登录
- 2025-9-4
|
发表于 2017-4-17 09:30:17
|
显示全部楼层
楼主你好,回答你的两个问题:
1)在使用KEA128的KDS配置CAN1时,如何配置CAN的发送中断失能呢?我不想在发送中断里发送报文!
答:请查看这个帖子里面我回答并添加的附件
http://community.nxp.com/thread/379133
这个就是用PE的模块,然后使能中断的例程。
如果你不想用中断的话,你可以选中左边框中CAN_LDD,右击鼠标,然后help on component,选中典型应用。
Sending data frame without interrupt service (polling)
The following example demonstrates sending a data frame with standard ID and extended ID.
OnFreeTxBuffer event is called when a frame is successfully transmitted and returns buffer index (in this case 0), which was send.
Required component setup :
Content of ProcessorExpert.c:
volatile bool DataFrameTxFlg;LDD_TDeviceData *MyCANPtr;LDD_TError Error;LDD_CAN_TFrame Frame;uint8_t OutData[4] = {0x00U, 0x01U, 0x02U, 0x03U}; /* Initialization of output data buffer */void main(void){ . . . MyCANPtr = CAN2_Init(NULL); /* Initialization of CAN2 component */ Frame.MessageID = 0x123U; /* Set Tx ID value - standard */ Frame.FrameType = LDD_CAN_DATA_FRAME; /* Specyfying type of Tx frame - Data frame */ Frame.Length = sizeof(OutData); /* Set number of bytes in data frame - 4B */ Frame.Data = OutData; /* Set pointer to OutData buffer */ DataFrameTxFlg = FALSE; /* Initialization of DataFrameTxFlg */ Error = CAN2_SendFrame(MyCANPtr, 0U, &Frame); /* Sends the data frame over buffer 0 */ while (!DataFrameTxFlg) { /* Wait until data frame is transmitted */ CAN2_Main(MyCANPtr); } . . . Frame.MessageID = (0x123456U | LDD_CAN_MESSAGE_ID_EXT); /* Set Tx ID value - extended */ Frame.FrameType = LDD_CAN_DATA_FRAME; /* Specyfying type of Tx frame - Data frame */ Frame.Length = sizeof(OutData); /* Set number of bytes in data frame - 4B */ Frame.Data = OutData; /* Set pointer to OutData buffer */ DataFrameTxFlg = FALSE; /* Clear DataFrameTxFlg */ Error = CAN2_SendFrame(MyCANPtr, 0U, &Frame); /* Sends the data frame over buffer 0 */ while (!DataFrameTxFlg) { /* Wait until data frame is transmitted */ CAN2_Main(MyCANPtr); } . . . for(;;) {}}
Content of Event.c:
extern volatile bool DataFrameTxFlg;void CAN2_OnFreeTxBuffer(LDD_TUserData *UserDataPtr, LDD_CAN_TMBIndex BufferIdx){ DataFrameTxFlg = TRUE; /* Set DataFrameTxFlg flag */}
Receiving data frame without interrupt service (polling)
The following example demonstrates receiving a frame with standard ID (Initialization over component) and extended ID, what is sets in run time.
OnFullRxBuffer event is called when a frame is successfully received and returns buffer index (in this case 0), where are data stored.
Required component setup :
Content of ProcessorExpert.c:
volatile bool DataFrameRxFlg = FALSE;LDD_TDeviceData *MyCANPtr;LDD_TError Error;LDD_CAN_TFrame Frame;uint8_t InpData[8]; void main(void){ . . . MyCANPtr = CAN2_Init(NULL); /* Initialization of CAN2 component */ while (!DataFrameRxFlg) { /* Wait until data frame is received */ CAN2_Main(MyCANPtr); } Frame.Data = InpData; /* Set pointer to InpData buffer */ Error = CAN2_ReadFrame(MyCANPtr, 0U, &Frame); /* Reads a data frame from buffer 0 and fills Frame structure */ /* Frame.MessageID => Contains ID value. if((Frame.MessageID & LDD_CAN_MESSAGE_ID_EXT)!=0) then extended ID, else standard ID Frame.FrameType => Type of Rx frame, e.g. LDD_CAN_DATA_FRAME Frame.Length => Number of Rx bytes in Rx frame InpData[] => Contains Rx data bytes */ . . . DataFrameRxFlg = FALSE; /* Clear DataFrameRxFlg */ Error = CAN2_SetRxBufferID(MyCANPtr, 0U, (0x123456U|LDD_CAN_MESSAGE_ID_EXT)); /* Set the new value of the Rx ID for buffer 0 - extended type */ while (!DataFrameRxFlg) { /* Wait until data frame is received */ CAN2_Main(MyCANPtr); } Frame.Data = InpData; /* Set pointer to InpData buffer */ Error = CAN2_ReadFrame(MyCANPtr, 0U, &Frame); /* Reads a data frame from buffer 0 and fills Frame structure */ /* Frame.MessageID => Contains ID value. if((Frame.MessageID & LDD_CAN_MESSAGE_ID_EXT)!=0) then extended ID, else standard ID Frame.FrameType => Type of Rx frame, e.g. LDD_CAN_DATA_FRAME Frame.Length => Number of Rx bytes in Rx frame InpData[] => Contains Rx data bytes */ . . . for(;;) {}}
Content of Event.c:
extern volatile bool DataFrameRxFlg;void CAN2_OnFullRxBuffer(LDD_TUserData *UserDataPtr, LDD_CAN_TMBIndex BufferIdx){ DataFrameRxFlg = TRUE; /* Set DataFrameRxFlg flag */}
2)补充下。除了自己写delay外,FTM配置外。还有没有利用SysTick进行延时设置的?
答,延时可以用所有的定时器实现。如果你要用Systick,当然可以,下面是systick的驱动:
#include "common.h"
#include "systick.h"
uint32_t cnt_start_value;
uint32_t cnt_end_value;
uint32_t overhead;
#if 0
__IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
__IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */
__IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */
__I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */
#endif
void systick_init(void)
{
SysTick->VAL = 0x0; /* clear current timer value */
SysTick->LOAD = 0x00FFFFFF;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
}
void systick_disable(void)
{
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
void cal_systick_read_overhead(void)
{
uint32_t cnt_start_value;
uint32_t cnt_end_value;
cnt_start_value = SysTick->VAL;
cnt_end_value = SysTick->VAL;
overhead = cnt_start_value - cnt_end_value;
#ifdef DEBUG_PRINT
printf("systick start value: 0x%x\n\r", (unsigned int)cnt_start_value);
printf("systick end value: 0x%x\n\r", (unsigned int) cnt_end_value);
printf("systick current value read overhead: 0x%x\n\r", (unsigned int)overhead);
#endif
}
|
|