|
本帖最后由 T-Rex1000 于 2024-8-12 15:28 编辑
void CAN_Transimit(uint16_t CAN_ID,uint8_t* datas,uint8_t len)
{
uint16_t CanID;
uint8 RX_Index=0,i=0;
uint8_t sr;
if(CAN_Init_finish)
{
sr=CanReadReg(SR);
if(sr&0x01)
{
CANAR=MR;
CANDR&=~0x04;
}
else
{
CanID = CAN_ID << 5;
CanWriteReg(TX_BUF0,len); //标准帧, 数据帧, bit3~bit0: 数据长度(DLC)
CanWriteReg(TX_BUF1,(uint8_t)(CanID>>8));
CanWriteReg(TX_BUF2,(uint8_t)CanID);
RX_Index = 3;
for(i=0;i<len;i++) //数据长度为DLC,最多不超过8
{
CanWriteReg((uint8_t)(TX_BUF0 + (RX_Index++&3)),datas); //写入有效数据
}
while(RX_Index&3) //判断已读数据长度是否4的整数倍
{
//写入填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
CanWriteReg((uint8_t)(TX_BUF0 + (RX_Index++&3)),0x00);
}
CanWriteReg(CMR,0x04); //发起一次帧传输
B_Can1Send = 1; //设置CAN1发送忙标志
}
}
}
|
|