This is the mail archive of the
ecos-discuss@sourceware.org
mailing list for the eCos project.
CAN on STM32 - No transmitting
- From: Bernhard Gebert <bernhard_gebert at web dot de>
- To: ecos-discuss at ecos dot sourceware dot org
- Date: Mon, 04 Jan 2010 18:24:35 +0100
- Subject: [ECOS] CAN on STM32 - No transmitting
Hello,
working with eCos 3.0 on STM32F103 single chip, my next problem is
CAN-related.
To keep the beginning as simple as possible, I decided to write an
example without eCos to test my hardware (and maybe my basic knowledge :-)).
I built an example with GCC (C++) running on my hardware without any
problems, now I want to port it to eCos. It uses an older version of the
ST peripheral lib.
I want to access the CAN-bus without a driver but directly from my
example app.
Now my problem:
Polling telegrams is possible from FIFO0, but when I enqueue a Telegram,
it never gets sent; after writing all three send buffers, the chip goes
bus-off.
Using an oscilloscope, i found out there is nothing at the output pins.
As I am able to receive correctly, and the same hw with the same code
can transmit, it might be a small bug.
Can you help me?
Brg,
Bernhard
The basic code:
void RCC_Configuration()
{
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* GPIO clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOD,
ENABLE); // CAN is D.0 and D.1
/* CAN1 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
}
void GPIO_Configuration(void)
{
#define GPIO_Remap2_CAN1 ((unsigned int)0x001D6000)
#define RCC_APB2Periph_GPIO_CAN RCC_APB2Periph_GPIOD
#define GPIO_Remap_CAN GPIO_Remap2_CAN1
#define GPIO_CAN GPIOD
#define GPIO_Pin_CAN_RX GPIO_Pin_0
#define GPIO_Pin_CAN_TX GPIO_Pin_1
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure CAN pin: RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_RX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIO_CAN, &GPIO_InitStructure);
/* Configure CAN pin: TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_TX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_CAN, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_CAN , ENABLE);
}
void CAN_Config(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
/* CAN register init */
CAN_DeInit();
CAN_StructInit(&CAN_InitStructure);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure.CAN_Prescaler = 16;//should result in ~250 kB
if(CAN_Init(&CAN_InitStructure) != CANINITOK)
{
diag_printf("CAN_Config() failed!\r\n");
}
else
{
diag_printf("CAN_Config() succeeded.\r\n");
}
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
}
void CCanPort::Init (void)
{
static int i = 0;
RCC_Configuration();
GPIO_Configuration();
CAN_Config();
...
CAN_Receive(CAN_FIFO0, &RxMessage);
CAN_Transmit(&TxMessage) ;
}
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss