#include "can/can.h"
-/// Baud rates
-#if SJA1000_CLK==(24000000)
- /* Bus speed, Precaler, SJW, TSEG1, TSEG2
- * For SJW setting we assume 1% xtal accuracy
+inline void can_data_pins_dir_output(void)
+{
+ IO1DIR|=P1_SJA1000_DATA_PINS; // Port as output to send data
+}
+
+inline void can_data_pins_dir_input(void)
+{
+ IO1DIR&=~P1_SJA1000_DATA_PINS; // Sets port as input
+}
+
+inline void can_data_pins_set_value(uint8_t data)
+{
+ uint32_t val = __val2mfld(P1_SJA1000_DATA_PINS,data);
+ /*
+ * Clear only that pins, which need that, lower transition
+ * frequency and eliminate spikes
*/
- const long sja1000_freqs[3][5]=
- {{1000, 0x00, 0xC0, 0x08, 0x10}
- ,{250, 0x02, 0xC0, 0x0A, 0x30}
- ,{100, 0x07, 0xC0, 0x09, 0x30}};
- const int sja1000_freq_cnt=3;
-#endif
+ IO1CLR= val ^ P1_SJA1000_DATA_PINS;
+ IO1SET= val;
+}
+
+inline uint8_t can_data_pins_get_value(void)
+{
+ return __mfld2val(P1_SJA1000_DATA_PINS,IO1PIN);
+}
-struct can_baudparams_t canbaud;
void can_comm_init()
{
+ //CANMSG("Start can_comm_init\n");
+ IO1DIR |= P1_OUT_PORT_CS_PIN|P1_SJA1000_RST_PIN;
// Due to change in design there is CS_PIN connected with ALE_PIN and ALE_PIN connection to LPC is interrupted
// We don't use ALE_PIN
//IO0DIR|=P0_SJA1000_ALE_PIN|P0_SJA1000_CS_PIN|P0_SJA1000_RD_PIN|P0_SJA1000_WR_PIN;
SET_OUT_PIN(IO0,P0_SJA1000_CS_PIN);
CLR_OUT_PIN(IO1,P1_SJA1000_RST_PIN);
- for (slowdown=0;slowdown<20*SJA1000_SCLK;slowdown++);
+ SJA1000_INIT_DELAY();
SET_OUT_PIN(IO0,P0_SJA1000_CS_PIN);
// Due to change in design there is CS_PIN connected with ALE_PIN and ALE_PIN connection to LPC is interrupted
// CLR_OUT_PIN(IO0,P0_SJA1000_ALE_PIN);
SET_OUT_PIN(IO1,P1_SJA1000_RST_PIN);
- for (slowdown=0;slowdown<20*SJA1000_SCLK;slowdown++);
-
+ SJA1000_INIT_DELAY();
}
-int can_write(uint8_t address,uint8_t* data)
+void can_write(uint8_t data, uint8_t address)
{
- IO1DIR|=0x00FF0000; // Port as output to send data
- IO1CLR=0x00FF0000; // Clear all data on port
+ can_data_pins_dir_output();
+ // Set memory address
+ can_data_pins_set_value(address);
// Init
SET_OUT_PIN(IO0,P0_SJA1000_RD_PIN); // Stays high on write
SET_OUT_PIN(IO0,P0_SJA1000_WR_PIN); // Stays high on address write
SET_OUT_PIN(IO0,P0_SJA1000_CS_PIN); // Sets output buffers to third state
- for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+ //SJA1000_DELAY();
//SET_OUT_PIN(IO0,P0_SJA1000_ALE_PIN); // Start command
- // Set memory address
- IO1SET=__val2mfld(0x00FF0000,address); // Shift data to SJA pins and output them
- for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+ //SJA1000_DELAY();
//CLR_OUT_PIN(IO0,P0_SJA1000_ALE_PIN); // Makes address active
CLR_OUT_PIN(IO0,P0_SJA1000_CS_PIN);
- for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+ //SJA1000_DELAY();
// Setting data
- CLR_OUT_PIN(IO0,P0_SJA1000_WR_PIN);
+ can_data_pins_set_value(data);
- IO1CLR=0x00FF0000;
- IO1SET=__val2mfld(0x00FF0000,*data);
- for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+ CLR_OUT_PIN(IO0,P0_SJA1000_WR_PIN);
+ CLR_OUT_PIN(IO0,P0_SJA1000_WR_PIN);
+ //SJA1000_DELAY();
SET_OUT_PIN(IO0,P0_SJA1000_WR_PIN); // Data should be accepted by now
SET_OUT_PIN(IO0,P0_SJA1000_CS_PIN);
- for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
- return 0;
+ //SJA1000_DELAY();
}
-int can_read(const uint8_t address,uint8_t* data)
+uint8_t can_read(const uint8_t address)
{
- IO1DIR|=0x00FF0000; // Port as output to set address
- IO1CLR=0x00FF0000; // Clear all data
+ uint8_t data;
+
+ can_data_pins_dir_output();
+ // Set memory address
+ can_data_pins_set_value(address);
// Init
SET_OUT_PIN(IO0,P0_SJA1000_WR_PIN); // Stays high on read
SET_OUT_PIN(IO0,P0_SJA1000_RD_PIN); // Stays high while entering address
SET_OUT_PIN(IO0,P0_SJA1000_CS_PIN);
- for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+ //SJA1000_DELAY();
//SET_OUT_PIN(IO0,P0_SJA1000_ALE_PIN);
- // Request memory address
- IO1SET=__val2mfld(0x00FF0000,address);
- for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+ //SJA1000_DELAY();
//CLR_OUT_PIN(IO0,P0_SJA1000_ALE_PIN);
CLR_OUT_PIN(IO0,P0_SJA1000_CS_PIN);
// Get data
- IO1DIR&=~0x00FF0000; // Sets port as input
+ can_data_pins_dir_input();
CLR_OUT_PIN(IO0,P0_SJA1000_RD_PIN);
- for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
- *data=__mfld2val(0x00FF0000,IO1PIN);
+ CLR_OUT_PIN(IO0,P0_SJA1000_RD_PIN);
+ //SJA1000_DELAY();
+ data = can_data_pins_get_value();
SET_OUT_PIN(IO0,P0_SJA1000_RD_PIN);
SET_OUT_PIN(IO0,P0_SJA1000_CS_PIN);
- for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
- return 0;
+ //SJA1000_DELAY();
+
+ return data;
}
int can_init(){
uint8_t data=0,count=0;
do {
can_comm_init();
- can_read(SJAMOD,&data);
+ data = can_read(SJAMOD);
if (count++ > 50)
return -1;
} while (!(data&sjaMOD_RM));
data=sjaCDR_CLKOUT_DIV1|sjaCDR_CLK_OFF|sjaCDR_CBP|sjaCDR_PELICAN;
- can_write((uint8_t)SJACDR,(uint8_t*)&data);
+ can_write(data, SJACDR);
// Single acceptance filter, reset mode
data=sjaMOD_AFM|sjaMOD_RM;
- can_write((uint8_t)SJAMOD,(uint8_t*)&data);
+ can_write(data, SJAMOD);
// Enabling all interrupt sources
data=sjaENABLE_INTERRUPTS;
- can_write((uint8_t)SJAIER,(uint8_t*)&data);
+ can_write(data, SJAIER);
// Accept all messages
data=0xFF;
- can_write((uint8_t)SJAAMR0,(uint8_t*)&data);
- can_write((uint8_t)SJAAMR0+1,(uint8_t*)&data);
- can_write((uint8_t)SJAAMR0+2,(uint8_t*)&data);
- can_write((uint8_t)SJAAMR0+3,(uint8_t*)&data);
+ can_write(data, SJAAMR0);
+ can_write(data, SJAAMR0+1);
+ can_write(data, SJAAMR0+2);
+ can_write(data, SJAAMR0+3);
data=sjaCMR_CDO;
- can_write((uint8_t)SJACMR,(uint8_t*)&data);
-
- return 0;
-}
-
-int can_autobaud(int tries){
- uint8_t data=0;
- int i=0,j,baudset=0;
- // Single acceptance filter, reset mode, listen mode for baud determination
- data=sjaMOD_LOM|sjaMOD_AFM|sjaMOD_RM;
- can_write((uint8_t)SJAMOD,(uint8_t*)&data);
- do {
- canbaud.baudrate=sja1000_freqs[i][0]*1000;
- canbaud.sjw=(sja1000_freqs[i][1]&0x3F)|(sja1000_freqs[i][2]&0xC0);
- canbaud.sample_pt=(sja1000_freqs[i][3]&0x0F)|(sja1000_freqs[i][4]&0x70);
- can_write(SJABTR0,(uint8_t *)(&canbaud.sjw));
- can_write(SJABTR1,(uint8_t *)(&canbaud.sample_pt));
- uint8_t intstor,temp;
- can_read(SJAIER,&intstor);
- temp=sjaIER_RIE|sjaIER_BEIE;
- can_write(SJAIER,&temp);
-
- /// Leave reset mode
- can_read(SJAMOD,&temp);
- temp&=~sjaMOD_RM;
- can_write(SJAMOD,&temp);
- j=0;
- do{
- can_read(SJAMOD,&temp);
- if (j++>20)
- return -1;
- } while (temp&sjaMOD_RM);
-
- /// Wait for successfull packet receive or receive error
- j=0;
- while (!(IO0PIN & P0_SJA1000_INT_PIN)){
- }
-
- can_read(SJAIR,&temp);
- if (temp & sjaIR_RI)
- baudset=1;
-
- /// Back to reset
- can_read(SJAMOD,&temp);
- temp|=sjaMOD_RM;
- can_write(SJAMOD,&temp);
- j=0;
- do{
- can_read(SJAMOD,&temp);
- if (j++>20)
- return -1;
- } while (!(temp&sjaMOD_RM));
-
- if (++i==sja1000_freq_cnt)
- return -1;
- } while (baudset==0);
- return 0;
-}
-
-int can_poll(){
-
- return 0;
-}
-
-int can_transmit_direct(uint8_t *data){
- int len=0,ext=0,i;
- uint8_t *ptr=data,tmitptr,temp;
- ext=(*ptr)& sjaFRM_FF;
- len=(*ptr)& 0xFF;
-
- // check if transmit buffer is free
- do {
- if (can_poll()==-1)
- return -1;
- can_read(SJASR,&temp);
- temp&=sjaSR_TBS;
- } while (!temp);
-
- tmitptr=SJAFRM;
- can_write(tmitptr++,data++); // Header
- can_write(tmitptr++,data++); // Ident 1
- can_write(tmitptr++,data++); // Ident 2
- if (ext){
- can_write(tmitptr++,data++); // Ident 3
- can_write(tmitptr++,data++); // Ident 4
- }
- for (i=0;i<len;i++)
- can_write(tmitptr++,data++); // Data i;
-
- // Set TR bit
- temp=sjaCMR_TR;
- can_write(SJACMR,&temp);
-
- return 0;
-}
-
-int can_transmit(int ext_header,int rtr,uint8_t *mask,int numbytes,uint8_t *data){
- uint8_t tmitptr,temp;
- int i=0;
-
- if (numbytes<0)
- numbytes=0;
-
- if (mask==NULL)
- ; // use internal mask
-
- // check if transmit buffer is free
- do {
- if (can_poll()==-1)
- return -1;
- can_read(SJASR,&temp);
- temp&=sjaSR_TBS;
- } while (!temp);
-
- tmitptr=SJAFRM;
- temp=(ext_header?sjaFRM_FF:0)|(rtr?sjaFRM_RTR:0)|(numbytes>8?0x08:numbytes);
- can_write(tmitptr++,&temp); // Header
-
- can_write(tmitptr++,mask++); // Ident 1
- can_write(tmitptr++,mask++); // Ident 2
- if (ext_header){
- can_write(tmitptr++,mask++); // Ident 3
- can_write(tmitptr++,mask++); // Ident 4
- }
- for (i=0;i<(numbytes>8?0x08:numbytes);i++)
- can_write(tmitptr++,data++); // Data i;
-
- // Set TR bit
- temp=sjaCMR_TR;
- can_write(SJACMR,&temp);
-
- return 0;
-}
-
-int can_receive(uint8_t len,uint8_t *data){
-
+ can_write(data, SJACMR);
return 0;
}