看上去没有问题,或是问题不是在这里出现的。
/*
*/
static struct rt_semaphore rx_sem; / 閻€劋绨幒銉︽暪濞戝牊浼呴惃鍕繆閸欑兘鍣� /
static rt_device_t can_dev; / CAN 鐠佹儳顦崣銉︾労 /
/ 閹恒儲鏁归弫鐗堝祦閸ョ偠鐨熼崙鑺ユ殶 /
static rt_err_t can_rx_call(rt_device_t dev, rt_size_t size)
{
/* CAN 閹恒儲鏁归崚鐗堟殶閹诡喖鎮楁禍褏鏁撴稉顓熸焽閿涘矁鐨熼悽銊︻劃閸ョ偠鐨熼崙鑺ユ殶閿涘瞼鍔ч崥搴″絺闁焦甯撮弨鏈典繆閸欑兘鍣� */
rt_sem_release(&rx_sem);
return RT_EOK;
}
int can_write( rt_uint32_t id ,rt_uint8_t *buffer)
{
rt_size_t size;
struct rt_can_msg msg = {0};
msg.id = id&0x3fffffff;
msg.ide = RT_CAN_EXTID;
msg.rtr = RT_CAN_DTR;
msg.len = 8;
msg.data[0] = buffer[0];
msg.data[1] = buffer[1];
msg.data[2] = buffer[2];
msg.data[3] = buffer[3];
msg.data[4] = buffer[4];
msg.data[5] = buffer[5];
msg.data[6] = buffer[6];
msg.data[7] = buffer[7];
size = rt_device_write(can_dev, 0, &msg, sizeof(msg));
if (size == 0)
{
rt_kprintf("can dev write data failed!\n");
}
return size;
}
extern unsigned short CANTime4;
unsigned short rqVol = 0;
void CAN_ChargeState(int id,unsigned char *data){
unsigned short vol = 0;
unsigned short amp = 0;
unsigned char state = 0;
vol = data[0]*256 + data[1];
amp = data[2]*256 + data[3];
vol = vol;
amp = amp;
state = data[4];
rt_kprintf("allowVol = %d ### realVol = %d\n",xgldsettings.bat_ParamData.reqVol,vol);
rt_kprintf("allowAmp = %d ### realAmp = %d\n",xgldsettings.bat_ParamData.reqAmp*10,amp);
rt_kprintf("contralState = %d\n",state);
unsigned char buf[8] = {0};
buf[0] = (rqVol ) >> 8 & 0xff;
buf[1] = (rqVol ) & 0xff;
buf[2] = (getXgldSettings()->bat_ParamData.reqAmp *10) >> 8 & 0xff;
buf[3] = (getXgldSettings()->bat_ParamData.reqAmp *10) & 0xff;
buf[4] = getXgldSettings()->bat_ParamData.canContral;
buf[5] = getXgldSettings()->bat_SystemData.SYS_SOC;
buf[6] = 0;
buf[7] = 0;
//CAN閫氳婵�娲绘柟寮�
if(id == 0x18FF50E5)
{
xgldsettings.bat_SystemState.CANState = true;
if((getXgldSettings()->bms_WorkState != Charge) && (getXgldSettings()->bat_SystemState.chargeFullSt == false) &&
(getXgldSettings()->bms_WorkState != Fault))
{
xgldsettings.bat_ParamData.reqAmp = getXgldSettings()->bat_ParamData.maxReqAmp;
rqVol = getXgldSettings()->bat_ParamData.reqVol;
xgldsettings.bat_SystemState.OBCState = true;
xgldsettings.bat_ParamData.canContral = 0;
}
if((getXgldSettings()->bat_SystemState.chargeFullSt == true) || (state & 0x17)){
xgldsettings.bat_ParamData.canContral = 1;//缁欏厖鐢垫満鍙戦�佸仠姝㈡姤鏂�
xgldsettings.bat_ParamData.reqAmp = 0;
rqVol = 0;
APP_CAN_PRINT("bigAmp=%d\n",getXgldSettings()->bat_AmpType.bigBranchAmp);
if(getXgldSettings()->bat_AmpType.bigBranchAmp <= 1000){
xgldsettings.bat_SystemState.OBCState = false;
}
}else{
CANTime4 = 0;
if(getXgldSettings()->bat_CellVolType.volHigh >= 4100){
xgldsettings.bat_ParamData.reqAmp = getXgldSettings()->bat_ParamData.maxReqAmp / 2;
}
}
can_write(0x1806E5F4,buf);
}
}
static void can_rx_thread(void *parameter){
//int i;
//rt_err_t res;
struct rt_can_msg rxmsg = {0};
/* 鐠佸墽鐤嗛幒銉︽暪閸ョ偠鐨熼崙鑺ユ殶 */
rt_device_set_rx_indicate(can_dev, can_rx_call);
struct rt_can_filter_item items[5] =
{
RT_CAN_FILTER_ITEM_INIT(0x100, 0, 0, 1, 0x700, RT_NULL, RT_NULL), /* std,match ID:0x100~0x1ff閿涘dr 娑擄拷 - 1閿涘矁顔曠純顕�绮拋銈堢箖濠娿倛銆� */
RT_CAN_FILTER_ITEM_INIT(0x300, 0, 0, 1, 0x700, RT_NULL, RT_NULL), /* std,match ID:0x300~0x3ff閿涘dr 娑擄拷 - 1 */
RT_CAN_FILTER_ITEM_INIT(0x211, 0, 0, 1, 0x7ff, RT_NULL, RT_NULL), /* std,match ID:0x211閿涘dr 娑擄拷 - 1 */
RT_CAN_FILTER_STD_INIT(0x486, RT_NULL, RT_NULL), /* std,match ID:0x486閿涘dr 娑擄拷 - 1 */
{0x555, 0, 0, 1, 0x7ff, 7,} /* std,match ID:0x555閿涘dr 娑擄拷 7閿涘本瀵氱�规俺顔曠純锟� 7 閸欑柉绻冨銈堛�� */
};
struct rt_can_filter_config cfg = {5, 1, items}; /* 娑擄拷閸忚鲸婀� 5 娑擃亣绻冨銈堛�� */
/* 鐠佸墽鐤嗙涵顑挎鏉╁洦鎶ょ悰锟� */
res = rt_device_control(can_dev, RT_CAN_CMD_SET_FILTER, &cfg);
RT_ASSERT(res == RT_EOK);
while (1)
{
/* hdr 閸婇棿璐� - 1閿涘矁銆冪粈铏规纯閹恒儰绮� uselist 闁炬崘銆冪拠璇插絿閺佺増宓� */
rxmsg.hdr = -1;
/* 闂冭顢g粵澶婄窡閹恒儲鏁规穱鈥冲娇闁诧拷 */
rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
/* 娴狅拷 CAN 鐠囪褰囨稉锟界敮褎鏆熼幑锟� */
rt_device_read(can_dev, 0, &rxmsg, sizeof(rxmsg));
/* 閹垫挸宓冮弫鐗堝祦 ID 閸欏﹤鍞寸�癸拷 */
rt_kprintf("ID:%x\n", rxmsg.id);
CAN_ChargeState(rxmsg.id,rxmsg.data);
for (unsigned char i = 0; i < 8; i++)
{
rt_kprintf("%2x", rxmsg.data[i]);
}
//
// APP_CAN_PRINT("n");
//can_write(0x1806E5F4,buf);
//rt_thread_delay(1000);//200ms寤舵椂
}
}
int can_write_sample(int argc, char *argv[])
{
rt_size_t size, i;
struct rt_can_msg msg = {0};
if (argc < 10)
{
rt_kprintf("can dev write data failed! \n");
return RT_ERROR;
}
msg.id = strtol(argv[1], NULL, 0);; /* ID 娑擄拷 0x78 */
msg.ide = RT_CAN_EXTID; /* 閹碘晛鐫嶉弽鐓庣础 */
msg.rtr = RT_CAN_DTR; /* 閺佺増宓佺敮锟� */
msg.len = 8; /* 閺佺増宓侀梹鍨娑擄拷 8 */
/* 瀵板懎褰傞柅浣烘畱 8 鐎涙濡弫鐗堝祦 */
for (i = 0; i < 8; i++)
{
msg.data[i] = strtol(argv[2 + i], NULL, 0);
}
/* 閸欐垿锟戒椒绔寸敮锟� CAN 閺佺増宓� */
size = rt_device_write(can_dev, 0, &msg, sizeof(msg));
if (size == 0)
{
rt_kprintf("can dev write data failed!\n");
}
return size;
}
MSH_CMD_EXPORT(can_write_sample, can device write sample);
int can_sample_init(void)
{
rt_err_t res;
rt_thread_t thread;
/* 閺屻儲澹� CAN 鐠佹儳顦� */
can_dev = rt_device_find(CAN_DEV_NAME);
if (!can_dev)
{
rt_kprintf("find %s failed!\n", CAN_DEV_NAME);
return RT_ERROR;
}
/* 閸掓繂顫愰崠锟� CAN 閹恒儲鏁规穱鈥冲娇闁诧拷 */
rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
/* 娴犮儰鑵戦弬顓熷复閺�璺哄挤閸欐垿锟戒焦鏌熷蹇斿ⅵ瀵拷 CAN 鐠佹儳顦� */
res = rt_device_open(can_dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX);
RT_ASSERT(res == RT_EOK);
// res = rt_device_control(can_dev, RT_CAN_CMD_SET_BAUD, (void *)CAN500kBaud);
// RT_ASSERT(res == RT_EOK);
/* 閸掓稑缂撻弫鐗堝祦閹恒儲鏁圭痪璺ㄢ柤 */
thread = rt_thread_create("can_rx", can_rx_thread, RT_NULL, 512, 7, 10);
if (thread != RT_NULL)
{
rt_kprintf("CAN_start_up\n");
rt_thread_startup(thread);
}
else
{
rt_kprintf("create can_rx thread failed!\n");
}
return res;
}
其实就是例程,但是不知道在哪设置的波特率,现在这样就是500可以,250不行,用这个contral函数设置为250后,500和250就都不行了
通了,现在是500k可以,想改为250k,就是不行,通过control函数设置也不行,不知道初始化是在哪设置的
enum CANBAUD
{
};
这些设置都应该没有问题的。
你设置为250K后,继续用500K还是可以进行通信?
@mii 设置成250后,500也不行了,但是250也不行,我直接用的就是例程
include <rtthread.h>
include "rtdevice.h"
define CAN_DEV_NAME "can1" / CAN 设备名称 /
static struct rt_semaphore rx_sem; / 用于接收消息的信号量 /
static rt_device_t can_dev; / CAN 设备句柄 /
/ 接收数据回调函数 /
static rt_err_t can_rx_call(rt_device_t dev, rt_size_t size)
{
}
static void can_rx_thread(void *parameter)
{
ifdef RT_CAN_USING_HDR
endif
}
int can_sample(int argc, char *argv[])
{
}
/ 导出到 msh 命令列表中 /
MSH_CMD_EXPORT(can_sample, can device sample);
进入debug模式,设置为250K的时候看看执行函数是那个,然后看相应寄存器有没有被改写成功。这部分要你细手对照一下手册了。
can通讯正常是需要can网络中的所有节点的速率都一致的。你调试的can速率变化了,其它节点的速率也要变化才行的。