⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcp2515.c

📁 一个在三星S3C44B0 ARM 上实现的带SPI接口的MCP2515 CAN总线控制芯片的 CAN 读写程序!
💻 C
📖 第 1 页 / 共 5 页
字号:
	            // SIO_Send (0x0a16);		//DAC POWERUP
			
				while (rIISCON & 0x80);  //当发送FIFO非空时,等待
				for(j=0; j<8; j++)
				{
					*IISFIF = Play_data[j];
				}

				n_databuff = 0;
			}

	       // SIO_Send (0x0a1e);
			
			break;
			
		default :
	    	
	    	break;    //不可能出现			
		}
}



/*********************************************************************************/
/*函数名称:CAN_RD_PLAY_SingleC                                                 */
/*函数功能:	读取从CAN总线上收到的数据,并直接给CODEC芯片(一次传输8*16bits)     */
/*入口参数:n_rxbuff : 接收缓冲器数                                              */
/*          NOTE : 1.如果收到的数据不足8个字节(只发生在通话结束),用0填充。    */
/*                 2.如果两个缓冲器都接收到数据,则一次性全部接收                */
/*                 3.只接收一个声道的数据,另一个声道的数据完全复制这个声道.     */
/*返回值  : 无                                                                   */
/*********************************************************************************/
void CAN_RD_PLAY_SingleC (unsigned char n_rxbuff)
{
	
	unsigned char	*Play_databyte;
	static unsigned short 	Play_data[8]={0};
	int i;
	
	Play_databyte = (unsigned char *)Play_data;
	
	switch (n_rxbuff)
	{
		
		case 0x0:
			break;

		case 0x1:
			
			MCP2515_Enable();
			MCP2515_READ_RXBUFF(0);
			
			for (i=4; i>0; i--)
			{
				SendSIOData(0);
				*(Play_databyte++) = ReadSIOData();
				SendSIOData(0);
				*(Play_databyte++) = ReadSIOData();
				Play_databyte = Play_databyte + 2;
				
			}
			
			MCP2515_Disable();
			
			for(i=0; i<4; i++)
			{
				Play_data[2*i+1] = Play_data[2*i];	
			}
		
	        // while (rIISCON&0x80);  //当发送FIFO非空时,等待
			
			
			for(i=0; i<8; i++)
			{
				*IISFIF = Play_data[i];
			}
			
			break;
			
		case 0x2:
			
			MCP2515_Enable();
			MCP2515_READ_RXBUFF(1);
			
			for (i=4; i>0; i--)
			{
				SendSIOData(0);
				*(Play_databyte++) = ReadSIOData();
				SendSIOData(0);
				*(Play_databyte++) = ReadSIOData();
				Play_databyte = Play_databyte+2;
				
			}
			
			MCP2515_Disable();
			
			for(i=0; i<4; i++)
			{
				Play_data[2*i+1] = Play_data[2*i];	
			}
			
	       // while (rIISCON&0x80);  //当发送FIFO非空时,等待	
			
			for(i=0; i<8; i++)
			{
				*IISFIF = Play_data[i];
			}
			
			break;		
			
		case 0x3:
			
			MCP2515_Enable();
			MCP2515_READ_RXBUFF(0);
			
			for (i=4; i>0; i--)
			{
				SendSIOData(0);
				*(Play_databyte++) = ReadSIOData();
				SendSIOData(0);
				*(Play_databyte++) = ReadSIOData();
				Play_databyte = Play_databyte+2;	
			}
			
			MCP2515_Disable();
			
			for(i=0; i<4; i++)
			{
				Play_data[2*i+1] = Play_data[2*i];	
			}
			
            // while (rIISCON&0x80);  //当发送FIFO非空时,等待
						
			for(i=0; i<8; i++)
			{
				*IISFIF = Play_data[i];
			}	
			
			Play_databyte = (unsigned char *)Play_data;
			MCP2515_Enable();
			MCP2515_READ_RXBUFF(1);
			
			for (i=4; i>0; i--)
			{
				SendSIOData(0);
				*(Play_databyte++) = ReadSIOData();
				SendSIOData(0);
				*(Play_databyte++) = ReadSIOData();
				Play_databyte = Play_databyte+2;
			}
			
			MCP2515_Disable();
			
			for(i=0; i<4; i++)
			{
				Play_data[2*i+1] = Play_data[2*i];	
			}
		
            // while (rIISCON&0x80);  //当发送FIFO非空时,等待			
			
			for(i=0; i<8; i++)
			{
				*IISFIF = Play_data[i];
			}
			
			break;
			
		default :
	    	
	    	break;    //不可能出现
			
		}		

}



/*******************************************************************/
/*函数名称 : Write_Dial_To_Can_ID                                  */
/*函数功能 : 写号码到 CAN ID                                       */
/*入口参数 : 无                                                    */
/*返回值   : 无                                                    */
/*******************************************************************/
void Write_Dial_To_Can_ID(U32 can_id)
{
	MCP2515_Write_Can_ID(TXB0SIDH, can_id,0);
	MCP2515_Write_Can_ID(TXB1SIDH, can_id,0);
	MCP2515_Write_Can_ID(TXB2SIDH, can_id,0);	
}


/*******************************************************************/
/*函数名称 : CAN_Init                                              */
/*函数功能 : 初始化 CAN 总线                                       */
/*入口参数 : 无                                                    */
/*返回值   : 无                                                    */
/*******************************************************************/
void CAN_Init(void)
{
	/*
	static int i=0;
	U32 id;
	int k;
	int j;
	int n;
	static int m=0;
	int count=0;
	
	unsigned char data_comp;
	unsigned char dlc;
	unsigned char rxRTR, isExt;
	
	unsigned short SOUND_DAT[256];
	*/
	
	//	U8 data[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};    //////测试
	//	U8 data_b[8]={0};

	//unsigned char *data_b;
	
	Init_SIO();
	init_MCP2515(BandRate_62kbps);

	canSetup();
	
	/*
	for(n=0;n<256;n++)
	{
		SOUND_DAT[n]=n;
	}
	*/

	/*	
	for(n=0;n<100;n++)
	{
		RX_B[n]=0;
	}
	*/	



	//	while (1)        //测试!!!!!!!!!!!!!!!!
	//	{
		//	canWrite(0x123, data, 8, 0, 0);
		//	k=0;
		//	n=0;
	
	
	MCP2515_Write_Can_ID(TXB0SIDH, 0x123,0);
	MCP2515_Write_Can_ID(TXB1SIDH, 0x123,0);
	MCP2515_Write_Can_ID(TXB2SIDH, 0x123,0);
	
	//	MCP2515_Write_Can_ID(RXF0SIDH, 0x123,0);          //设置验收滤波寄存器
	
	MCP2515_Write(0x35, 8);   //数据长度
	MCP2515_Write(0x45, 8);
	MCP2515_Write(0x55, 8);

	//	Delay(1); //延迟100US
	
	/*
	while(1)
	{	
		k=0;
		n=0;
		while(k < 512)
		//	for (j=0;j<25;j++)
		{		
		// rPDATE=(rPDATE|0x0008);	
		   data_b=(unsigned char *)SOUND_DAT+k;
		// canWrite(0x123,data_b, 8, 0, 0);
		// rPDATE=(rPDATE|0x0008);
		   MCP2515_CAN_WRITE(data_b);
		// rPDATE=(rPDATE&0xfff7);
		  Delay(30);
		  MCP2515_CAN_WRITE(data_b+8);
		// k +=8;

		  Delay(280);
		// rPDATE=(rPDATE&0xfff7);
		
		  while ((data_len[n] =MPC2515_CanPoll() )==0);
		// if(data_len[n] =MPC2515_CanPoll())
		// {
			// rPDATE=(rPDATE|0x0008);
			// MCP2515_Read_Can_ID(0x61, &id);
			   CAN_RD((unsigned char *)RX_B+k, &dlc, data_len[n]);

			  if (data_len[n] != 3)
			  {
			     while ((data_len[n] =MPC2515_CanPoll() )==0);
			     CAN_RD((unsigned char *)RX_B+k+8, &dlc, data_len[n]);		
			  }

			// rPDATE=(rPDATE&0xfff7);

		    if (k != 0)
		    {
		 		data_comp = (*((unsigned char *)RX_B+k))-(*((unsigned char *)RX_B+k-2));
		
			    if((data_comp  != 1)&(data_comp  !=0xff))
		        {
					m++;
			
					if ( m ==9)
						m=8;	
				}
			}

			// k = dlc+k;
			// k = (data_len[n] !=0)*8+k;
		
			k += 8;
			k += 8;
		
			// Delay(2); //延迟100US
			// while(data_len[n]==2);

			n++;

			if ((err_f[count]=MCP2515_Read(EFLG)))
			{			
				// while(err_f[count]==0x40);
				count++;
							
				if (count==50)
					count=0;
			}

			// err_count[n++] = MCP2515_Read(0x1c);
		    if (n == 64)
			    n=0;	
			i++;
		
			// rPDATE=(rPDATE&0xfff7);
			// while(i==2);
		}

	//	}
	}	
	*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -