257 lines
8.0 KiB
C
257 lines
8.0 KiB
C
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include "osi_api.h"
|
|
#include "ql_api_osi.h"
|
|
|
|
#include "ql_api_spi.h"
|
|
#include "mcp2515.h"
|
|
// #include "hw.h"
|
|
// #include "cfg.h"
|
|
#include "../EC600U_t2n/include/t2n.h"
|
|
#include "ql_log.h"
|
|
|
|
#define LOGD(msg, ...) QL_LOG(QL_LOG_LEVEL_DEBUG, "can", msg, ##__VA_ARGS__)
|
|
#define LOGI(msg, ...) QL_LOG(QL_LOG_LEVEL_INFO, "can", msg, ##__VA_ARGS__)
|
|
#define LOGW(msg, ...) QL_LOG(QL_LOG_LEVEL_WARN, "can", msg, ##__VA_ARGS__)
|
|
#define LOGE(msg, ...) QL_LOG(QL_LOG_LEVEL_ERROR, "can", msg, ##__VA_ARGS__)
|
|
#define QL_SPI_WAIT_NONE 0
|
|
#define QL_SPI_WAIT_WRITE 1
|
|
#define QL_SPI_WAIT_READ 2
|
|
osiThread_t *can_task_handle = NULL;
|
|
|
|
extern uint16_t gWordVar[];
|
|
|
|
struct can_status *can_status[2] = {(struct can_status *)&gWordVar[512], (struct can_status *)&gWordVar[520]};
|
|
// struct can_dev_cfg *can_dev_cfg = (struct can_dev_cfg *)&gWordVar[0x1000];
|
|
|
|
// ql_sem_t spi_write_semaphore;
|
|
// ql_sem_t spi_read_semaphore;
|
|
// static int spi_wait_write_read;
|
|
|
|
// static void spi_cb_handler(ql_spi_irq_s cause)
|
|
// {
|
|
// if (cause.rx_dma_done == 1 && spi_wait_write_read == QL_SPI_WAIT_READ)
|
|
// {
|
|
// spi_wait_write_read = 0;
|
|
// ql_rtos_semaphore_release(spi_read_semaphore);
|
|
// }
|
|
// if (cause.tx_dma_done == 1 && spi_wait_write_read == QL_SPI_WAIT_WRITE)
|
|
// {
|
|
// spi_wait_write_read = 0;
|
|
// ql_rtos_semaphore_release(spi_write_semaphore);
|
|
// }
|
|
// // LOGD("spi_cb_handler rx_dma_done=%d tx_dma_done=%d\r\n", cause.rx_dma_done, cause.tx_dma_done);
|
|
// }
|
|
|
|
int spi_write(int fd, uint8_t *outbuf, int len)
|
|
{
|
|
int ret;
|
|
// spi_wait_write_read = QL_SPI_WAIT_WRITE;
|
|
// ql_spi_request_sys_clk(fd);
|
|
ret = ql_spi_write(fd, outbuf, len);
|
|
// ql_rtos_semaphore_wait(spi_write_semaphore, 10);
|
|
// LOGD("spi_write inbuf=%p,len=%d,ret=%x", outbuf, len, ret);
|
|
return ret;
|
|
}
|
|
|
|
int spi_write_read(int fd, uint8_t *outbuf, uint8_t *inbuf, int len)
|
|
{
|
|
int ret;
|
|
// spi_wait_write_read = QL_SPI_WAIT_READ;
|
|
ret = ql_spi_write_read(fd, inbuf, outbuf, len);
|
|
// ql_rtos_semaphore_wait(spi_read_semaphore, 10);
|
|
// LOGD("spi_write_read inbuf=%p,outbuf=%p,len=%d,ret=%x", inbuf, outbuf, len, ret);
|
|
return ret;
|
|
}
|
|
|
|
static void gpio_mcp_int_cb(void *ctx)
|
|
{
|
|
ql_event_t event;
|
|
event.id = 1000;
|
|
if (can_task_handle)
|
|
{
|
|
ql_rtos_event_send(can_task_handle, &event);
|
|
}
|
|
|
|
// LOGI("gpio_mcp_int_cb");
|
|
}
|
|
|
|
osiTimer_t *can_led_timer = NULL;
|
|
void can_led_timer_cb(void *param)
|
|
{
|
|
ql_event_t event;
|
|
event.id = 1001;
|
|
if (can_task_handle)
|
|
{
|
|
ql_rtos_event_send(can_task_handle, &event);
|
|
}
|
|
}
|
|
void can_task(void *data)
|
|
{
|
|
int ret;
|
|
// ret = ql_pin_set_func(QL_CUR_SPI2_CS_PIN, QUEC_PIN_SPI2_FUNC);
|
|
// if (ret != QL_GPIO_SUCCESS)
|
|
// {
|
|
// LOGE("set pin err");
|
|
// }
|
|
// ret = ql_pin_set_func(QL_CUR_SPI2_CLK_PIN, QUEC_PIN_SPI2_FUNC);
|
|
// if (ret != QL_GPIO_SUCCESS)
|
|
// {
|
|
// LOGE("set pin err");
|
|
// }
|
|
// ret = ql_pin_set_func(QL_CUR_SPI2_DO_PIN, QUEC_PIN_SPI2_FUNC);
|
|
// if (ret != QL_GPIO_SUCCESS)
|
|
// {
|
|
// LOGE("set pin err");
|
|
// }
|
|
// ret = ql_pin_set_func(QL_CUR_SPI2_DI_PIN, QUEC_PIN_SPI2_FUNC);
|
|
// if (ret != QL_GPIO_SUCCESS)
|
|
// {
|
|
// LOGE("set pin err");
|
|
// }
|
|
// ret = ql_pin_set_func(GPIO_10, 0); // set pin4 sp1_cs to gpio fun
|
|
// if (ret != QL_GPIO_SUCCESS)
|
|
// {
|
|
// LOGE("set pin err");
|
|
// }
|
|
// ql_gpio_deinit(GPIO_10);
|
|
// ql_gpio_init(GPIO_10, GPIO_INPUT, PULL_UP, LVL_HIGH);
|
|
|
|
ql_spi_config_s spi_config = {0};
|
|
int spi_no = QL_SPI_PORT2;
|
|
spi_config.port = spi_no;
|
|
spi_config.spiclk = QL_SPI_CLK_6_25MHZ;
|
|
spi_config.framesize = 8;
|
|
spi_config.input_mode = QL_SPI_INPUT_TRUE;
|
|
spi_config.cs_polarity0 = QL_SPI_CS_ACTIVE_LOW;
|
|
spi_config.cs_polarity1 = QL_SPI_CS_ACTIVE_LOW;
|
|
spi_config.cpol = QL_SPI_CPOL_LOW;
|
|
spi_config.cpha = QL_SPI_CPHA_1Edge;
|
|
spi_config.input_sel = QL_SPI_DI_1;
|
|
spi_config.transmode = QL_SPI_DIRECT_POLLING;
|
|
spi_config.cs = QL_SPI_CS0;
|
|
spi_config.clk_delay = QL_SPI_CLK_DELAY_0;
|
|
ql_spi_init_ext(spi_config);
|
|
ql_spi_cs_auto(spi_no);
|
|
// ql_rtos_semaphore_create(&spi_read_semaphore, 0);
|
|
// ql_rtos_semaphore_create(&spi_write_semaphore, 0);
|
|
|
|
// ql_spi_irq_s mask = {
|
|
// .rx_dma_done = 1,
|
|
// .tx_dma_done = 1,
|
|
// };
|
|
|
|
// ql_spi_set_irq(spi_no, mask, spi_cb_handler);
|
|
|
|
can_config_t can_cfg;
|
|
memset(&can_cfg, 0, sizeof(can_cfg));
|
|
can_cfg.baud_rate = 500000;
|
|
can_cfg.can_mode = MODE_NORMAL;
|
|
can_cfg.rx_ctrl[0] = RXB_RX_ANY;
|
|
can_cfg.rx_ctrl[1] = RXB_RX_ANY;
|
|
can_cfg.rx_mask[0] = 0x1fffffff | CAN_EFF_FLAG;
|
|
can_cfg.rx_mask[1] = 0x1fffffff | CAN_EFF_FLAG;
|
|
can_cfg.rx_filter[0] = 0x18FEEE00 | CAN_EFF_FLAG;
|
|
can_cfg.rx_filter[1] = 0x18FEEF00 | CAN_EFF_FLAG;
|
|
can_cfg.rx_filter[2] = 0X18FEE500 | CAN_EFF_FLAG;
|
|
ret = mcp_can_init(spi_no, &can_cfg);
|
|
if (ret != 0)
|
|
{
|
|
LOGE("mcp_can_init fail ret=%d\n", ret);
|
|
}
|
|
// ql_rtos_task_get_current_ref(&can_task_handle);
|
|
can_task_handle = osiThreadCurrent();
|
|
// ql_pin_set_func(15, 4); // set GPIO22
|
|
ql_int_register(GPIO_22, EDGE_TRIGGER, DEBOUNCE_DIS, EDGE_FALLING, PULL_UP, gpio_mcp_int_cb, NULL);
|
|
ql_int_enable(GPIO_22);
|
|
int tx_led_status = 0;
|
|
int rx_led_status = 0;
|
|
// can_led_timer = osiTimerCreate(can_task_handle, can_led_timer_cb, NULL); // 创建定时器
|
|
// if (NULL == can_led_timer)
|
|
// {
|
|
// LOGE("can_led_timer create failed\n");
|
|
// osiThreadExit();
|
|
// }
|
|
// ret = osiTimerStart(can_led_timer, 100);
|
|
// if (ret != TRUE)
|
|
// {
|
|
// LOGE("can_led_timer start failed\n");
|
|
// }
|
|
while (1)
|
|
{
|
|
ql_event_t event;
|
|
ql_LvlMode int_value;
|
|
if (ql_event_wait(&event, 100) != 0) // 中断有时会丢失,所以超时也读取接收缓冲区
|
|
{
|
|
event.id = 1000;
|
|
ql_gpio_get_level(GPIO_22, &int_value);
|
|
}
|
|
else
|
|
{
|
|
int_value = 0;
|
|
}
|
|
switch (event.id)
|
|
{
|
|
|
|
case 1000: {
|
|
if (int_value == 0)
|
|
{
|
|
LED0_ON(spi_no);
|
|
rx_led_status = 1;
|
|
do
|
|
{
|
|
CanRxMsg RxMsg;
|
|
if (can_read_rxbuf(spi_no, &RxMsg))
|
|
{
|
|
// LOGI("CAN0: Id=0x%x,IDE=%d,DLC=%d,Data=[%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x]", RxMsg.Id, RxMsg.IDE, RxMsg.DLC, RxMsg.Data[0], RxMsg.Data[1], RxMsg.Data[2], RxMsg.Data[3], RxMsg.Data[4], RxMsg.Data[5], RxMsg.Data[6], RxMsg.Data[7]);
|
|
// if (can_ops[0] != NULL && can_ops[0]->parse)
|
|
// {
|
|
// can_status[0]->rx_cnt++;
|
|
// can_ops[0]->parse(&RxMsg);
|
|
// }
|
|
}
|
|
ql_gpio_get_level(GPIO_22, &int_value);
|
|
} while (int_value == 0);
|
|
LED0_OFF(spi_no);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
// case 1001:
|
|
// if (rx_led_status == 1)
|
|
// {
|
|
// LED0_OFF(spi_no);
|
|
// rx_led_status = 2;
|
|
// }
|
|
// else if(rx_led_status == 2)
|
|
// {
|
|
// rx_led_status = 0;
|
|
// }
|
|
// if (tx_led_status == 1)
|
|
// {
|
|
// LED1_OFF(spi_no);
|
|
// tx_led_status = 2;
|
|
// }
|
|
// else if(rx_led_status == 2)
|
|
// {
|
|
// rx_led_status = 0;
|
|
// }
|
|
// osiTimerStart(can_led_timer, 100);
|
|
// break;
|
|
case 0: {
|
|
CanTxMsg TxPack = {
|
|
.Id = 0x182,
|
|
.IDE = CAN_ID_STD,
|
|
.DLC = 8,
|
|
.Data = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}};
|
|
LED1_ON(spi_no);
|
|
tx_led_status = 1;
|
|
can_tx_pack(spi_no, &TxPack);
|
|
can_status[0]->bus_status = get_mcp_status(spi_no);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|