MPLAB无法使用picstar plus,为何?请指教。
|
|
|||
---|---|---|---|---|
新會員
|
發表於: 2010/5/5 9:33
|
|||
|
Re: CAN通讯,可以loopback正常,但是nor 方式,没有输出.
|
||||
---|---|---|---|---|
新會員
|
用LOOPBCAK工作模式,正常,可以收到串口来的数据,
但是用nor工作模式,也就是上楼的程序,就不能接收到数据, CANH CANL 电压为0.
發表於: 2009/10/21 22:35
|
|||
|
CAN通讯,可以loopback正常,但是nor 方式,没有输出.
|
||||
---|---|---|---|---|
新會員
|
// 自循环方式, 全过滤方式 让RXB0 接受数据,后累计求和,判断正确的话,让所有6个流水灯全亮.
//程序已经调通. #include "p30f4011.h" #include "can.h" #include "uart.h" #define CAN1_TX _RF1 #define CAN1_RX _RF0 #define DIR_CAN1_TX _TRISF1 #define DIR_CAN1_RX _TRISF0 #define INPUT 1 #define OUTPUT 0 //void __attribute__((__interrupt__,no_auto_psv)) _U2TXInterrupt() void delay(unsigned int t) { unsigned int x,y; for(x=6414;x>0;x--) for(y=t;y>0;y--); } unsigned char TxData[10]={0,0,0,0,0,0,0,0,0,0}; unsigned char RxData[10]={0,0,0,0,0,0,0,0,0,0}; void Initial_CAN( void ) { CAN1SetOperationMode( CAN_IDLE_CON & CAN_MASTERCLOCK_1 & //Fcan=Fcy CAN_REQ_OPERMODE_CONFIG ) ;//can为配置模式,只有计入配置模式,才可改写其他寄存器 while ( C1CTRLbits.OPMODE <= 3 );//直道当前操作模式小于三,表示进入配置模式 CAN1Initialize( CAN_SYNC_JUMP_WIDTH3 &//同步跳转宽度为3TQ CAN_BAUD_PRE_SCALE(9),//BRP==9 CAN_WAKEUP_BY_FILTER_DIS &//不被接受滤波器唤醒 CAN_PHASE_SEG2_TQ(4) &//相位2为4个TQ CAN_PHASE_SEG1_TQ(6) &//相位1为6个TQ CAN_PROPAGATIONTIME_SEG_TQ(2) & //传播段占用2TQ CAN_SEG2_FREE_PROG &//相位2的宽度为可以自由编程设定 CAN_SAMPLE1TIME ) ;//相位1结束后采样一次总线 CAN1SetFilter ( (char) 0 , CAN_FILTER_SID( 0x200 ) &CAN_RX_EID_DIS ,//仅接受标准ID,用RF0滤波器 CAN_FILTER_EID( 0x00 )) ;//过滤器的扩展位设置全0 CAN1SetFilter ( (char) 1 , //用RF1过滤器 CAN_FILTER_SID( 0x300 ) &CAN_RX_EID_DIS ,//仅接受标准ID 过滤器的标准ID为全0 CAN_FILTER_EID( 0x00 )) ; CAN1SetMask ( (char)0 , //用0号屏蔽寄存器 CAN_MASK_SID ( 0xFFFF ) //屏蔽寄存器的SID=0X7FF & CAN_MATCH_FILTER_TYPE ,//由于过滤器仅接受标准ID故屏蔽寄存器要设定依据过滤器从而实现仅过滤标准ID CAN_MASK_EID( 0x00) ) ; CAN1SetTXMode( (char) 0 , CAN_TX_STOP_REQ & CAN_TX_PRIORITY_HIGH ) ; CAN1SetRXMode( (char) 0 , CAN_RXFUL_CLEAR & CAN_BUF0_DBLBUFFER_DIS ) ; CAN1SetOperationMode( CAN_IDLE_CON & //器件闲置,CAN依然工作 CAN_CAPTURE_DIS &//禁止捕捉 CAN_MASTERCLOCK_1 &//Fcy=Fcan CAN_REQ_OPERMODE_LOOPBK ) ; //can工作在普通模式 while (C1CTRLbits.OPMODE!=2) { } //确认进入自测试模式 } void initIO() { TRISE=0; LATE=0; DIR_CAN1_TX = OUTPUT ; DIR_CAN1_RX = INPUT ; } int main( void ) { initIO(); Initial_CAN( ) ; unsigned char i,sum=0; TxData[0] = 0 ; TxData[1] = 0 ; TxData[2] = 0 ; TxData[3] = 0 ; TxData[4] = 2 ; TxData[5] = 6 ; TxData[6] = 0 ; TxData[7] = 0 ; while(!CAN1IsTXReady(0)); CAN1SendMessage(( CAN_TX_SID(0x200))&CAN_TX_EID_DIS&CAN_SUB_NOR_TX_REQ,(CAN_TX_EID(0x00))&CAN_NOR_TX_REQ,TxData,8,0) ; while (!CAN1IsRXReady(0));//RXB0没有接收到数据,就在此处等待, CAN1ReceiveMessage( RxData,8,0 ) ; // 一旦接收标志为RX0FUL=1,说明数据接收 C1RX0CONbits.RXFUL = 0 ; for(i=0;i<8;i++) { putcUART2(RxData[i]); } while (1) ; } 可以正常工作,并可以用收到串口的过来的数据.
發表於: 2009/10/21 22:33
|
|||
|
为什么进不了外部中断? 请指教
|
||||
---|---|---|---|---|
新會員
|
#include"p33fj16mc304.h"
int main() { _INT0EP=1;//下降沿中断 _INT0IP=6;//中断优先级为6 _INT0IE=1;//中断使能 ADPCFG=0XFF;//禁用ad TRISC=0;//c口输出,驱动led,只是中断状态 LATC=0xff;//让led全亮 TRISB=0XFF;//中断0的pin,设为输入. while(1); } void _ISR _INT0Interrupt(void) { _INT0IF=0;//清中断标志 LATC=0X00;//一旦进入中断,让led全灭. } 总是进不去中断,int0脚,上皆有上拉电阻.
發表於: 2009/10/17 18:42
|
|||
|
DIY一个30f4011的开发板.
|
||||
---|---|---|---|---|
新會員
|
Attach file: (0.00 KB)
發表於: 2009/8/9 12:12
|
|||
|