|
发表于 2011-11-1 17:11:22
|
显示全部楼层
你好,
我按照你的程序写了个实例,但是我用的是PB8和PB9,引脚重新映射已经定义了,但是tx引脚上就是没有信号,能不能帮忙看看,谢谢:
我使用的是STM32F103RB芯片,软件库函数是V3.4.0——2010-10-15,写了个CAN程序,但是怎么弄TX引脚上无信号。
求解:
CAN_TX使用的是PB9,CAN_RX使用的是PB8,程序如下:
void GPIO_Configuration( void )
{
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE );
// AFIO重新映射时钟使能
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO,ENABLE );
// CAN1引脚复用重映射功能使能
GPIO_PinRemapConfig( GPIO_Remap1_CAN1,ENABLE ); //AFIO_MAPR_CAN_REMAP_REMAP2
// Configure CAN pin: RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// Configure CAN pin: TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void CAN_Configuration( void )
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
// 使能外围CAN1时钟
RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE);
CAN_DeInit( CAN1 );
CAN_StructInit( &CAN_InitStructure );
// 禁止时间触发通行模式
CAN_InitStructure.CAN_TTCM = DISABLE;
// 软件对CAN_MCR寄存器的INRQ位进行置1随后清0后,一旦硬件检测
// 到128次11位连续的隐性位,就退出离线状态
CAN_InitStructure.CAN_ABOM = ENABLE;
// 睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒
CAN_InitStructure.CAN_AWUM = ENABLE;
// CAN报文自动重发直到成功为止
CAN_InitStructure.CAN_NART = DISABLE;
// 在接收溢出时FIFO未被锁定,当接收FIFO的报文未被读出,下一个收到的报文会覆盖原有的报文
CAN_InitStructure.CAN_RFLM = DISABLE;
// 发送FIFO优先级由报文的标识符来决定
CAN_InitStructure.CAN_TXFP = DISABLE;
// CAN硬件工作在正常模式
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
// 重新同步跳跃宽度1个时间单位
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
// 时间段1为8个时间单位
CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;//CAN_BS1_12tq;
// 时间段2为7个时间单位
CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
// (pclk1/((1+8+7)*9)) = 36Mhz/[(CAN_SJW_1tq+CAN_BS1_8tq+CAN_BS2_7tq)*(CAN_Prescaler)] = 250Kbits设定了一个时间单位的长度 CAN_InitStructure.CAN_Prescaler = 9;
CAN_Init( CAN1,&CAN_InitStructure );
// CAN filter init 过滤器初始化
// 指定了待初始化的过滤器0
CAN_FilterInitStructure.CAN_FilterNumber = 0;
// 指定了过滤器将被初始化到的模式为标识符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
// 给出了过滤器位宽1个32位过滤器
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
// 用来设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
// 用来设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
// 用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
// 用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
// 设定了指向过滤器的FIFO0
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
// 使能过滤器
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit( &CAN_FilterInitStructure );
}
void CAN_TxData(char data)
{
CanTxMsg TxMessage;
u32 i = 0;
uint8_t TransmitMailbox = 5;
/* transmit 1 message */
TxMessage.StdId=0x00000001;
// TxMessage.ExtId=0x00000000;
TxMessage.IDE=CAN_ID_STD;
TxMessage.RTR=CAN_RTR_DATA;
TxMessage.DLC= 1;
TxMessage.Data[0] = data;
TransmitMailbox = CAN_Transmit( CAN1,&TxMessage );
while((CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK) && (i != 0xFF))
{
i++;
}
}
int main( void )
{
Device_Init();
LED1_ON;
Delay(72000); // 7ms
while( 1 )
{
LED1_OFF;
Delay(720000);
CAN_TxData(0x55);
Delay(720000);
}
}
大侠们赐教啊,
我看了好多的程序也都差不多,我的就是用的引脚是用PB8和PB9,但是我已经重新映射过了, 不过不知道多不对,TX引脚上一直无信号。 |
|