检一2103做的产品,想拿来学学。查查资料写了个SPI的程序,用示波器看怎么连SCK信号都没有?郁闷了好几天了,芯片没坏,我串口都能出数据。请高手帮忙看看,谢谢!<br />#include "config.h"<br /><br />#define PWM0CON (*((volatile unsigned long *) 0xE0004074))<br />/* flash */<br />#define FlashCmd1 0x03;<br />unsigned char inbuff[32];<br />unsigned char outbuff[32];<br />unsigned char in_num;<br />unsigned char out_num;<br />unsigned char out_ptr;<br /><br />uint8 temp;<br /><br /><br />unsigned int rec_num;<br />unsigned char flag;<br />uint32 step_num;<br /><br /><br /><br /><br /><br />void Delay(uint32 dly);<br /><br /><br />//uint8 rcv_buf[8]; // UART0数据接收缓冲区<br />//volatile uint8 rcv_new; // 接收新数据标志<br />/***********FLASH 函数*************/<br />//spi<br />//dig=(dig%100)+160+((dig/100)+160)*256<br /><br />#define MSTR (1<<5) //<br />#define CPOL (1<<4) //<br />#define CPHA (1<<3) //<br />#define LSBF (1<<6) //<br /><br />#define MSPI_MODE (MSTR|CPOL|CPHA) /*接口模式MSTR = 1,CPOL = 1,CPHA = 0,LSBF = 0 */<br />#define SSPI_MODE (CPHA) <br /><br />#define SPI_CS (1<<18) <br /><br />/*<br />void SSpiIni(void)<br />{<br /> S1PCR = SSPI_MODE;<br /><br />}<br />void SSendData(unit8 data)<br />{<br /> S1PDR = data;<br /> while(0 == (S1PSR&0X80));<br /><br />}<br />unit8 SRcvData(void)<br />{<br /> while(0 == (S1PSR&0x80));<br /> return(S1PDR);<br />}<br /><br /><br /><br />*/<br /><br />///////////////////////////////////////////////////////////////////////////////////////////////<br /><br />void MSPI_Init(uint8 fdiv) //初始化SPI接口,设置为主机fdiv 大于8的偶数<br />{<br /> if(fdiv<8) fdiv = 8;<br /> S0PCCR = fdiv&0xfe; //2103没有SPI0和SPI1 !!!!!设置SPI时钟分频<br /> Delay(5555);<br /> IOSET|= 1<<9; //deng mei<br /> Delay(5555); <br /> S0PCR = MSPI_MODE; // S0SPCR?????? <br />// S0PCR = 0x38;<br /> IOCLR|= 1<<9; <br /> Delay(5555);<br />}<br />uint8 MSendData(uint8 data)<br />{<br /> IOCLR = SPI_CS;<br /><br /> S0PDR = data;<br /> while(0==(S0PSR&0X80));<br /><br /> IOSET = SPI_CS; <br /><br /> return(S0PDR);<br />}<br /><br /> <br /><br /><br /><br /><br />///////////////////////////////////////////<br /><br />void Feed(unsigned long step)<br />{<br /> step_num = step;<br /> T0TCR = 0x01; //启动定时器<br /> IOSET |= 1<<30; //打开电动机电源<br />}<br /><br />void __irq InterUart0() <br />{<br /> if((U0LSR & 0x01)==1)<br /> {<br /> IOSET |= 1<<9;<br /> inbuff[in_num] = U0RBR;<br />// U0THR = inbuff[in_num];<br /> U0THR = temp; //<br /><br /> in_num++;<br /> if(in_num > 32)<br /> {<br /> in_num=0;<br /> }<br /> } <br /> VICVectAddr = 0;<br /> Feed(200);<br />}<br /><br />void __irq InterTime0()<br />{<br /> T0IR = 0x01; //CR3中断;p0.18 复位中断;<br /> T0TCR = 0x00; //关闭定时器;<br />// U0THR = 'o';<br /> while( (U0LSR&0x40)==0); <br /> VICVectAddr = 0;<br /> if(flag==0)<br /> {<br /> if((IOSET&(1<<11))!=0)<br /> {<br /> IOCLR |= 1<<11; <br /> }<br /> else <br /> {<br /> IOSET |= 1<<11; <br /> }<br /> flag = 1;<br /> }<br /> else<br /> {<br /> if((IOSET&(1<<12))!=0)<br /> {<br /> IOCLR |= 1<<12; <br /> }<br /> else<br /> {<br /> IOSET |= 1<<12; <br /> }<br /> flag = 0; <br /> }<br /> if(--step_num!=0)<br /> {<br /> T0TCR = 0x01;<br /> }<br /> else<br /> {<br /> uint32 loop=0xff;<br /> while(loop--!=0);<br /> IOCLR |= 1<<30;<br /> } <br />}<br /><br />void Uart0Init()<br />{<br /> unsigned int fdiv;<br /> VICIntSelect &= 0xbf;<br /> VICIntEnable |= 1<<6;<br /> VICVectCntl1 = 0x26; <br /> VICVectAddr1 = (uint32)InterUart0; <br /> U0LCR = 0X83; //允许访问除数寄存器在DLAB==1<br /> fdiv = (Fpclk/16)/9600; //<br /> U0DLM = fdiv>>8;<br /> U0DLL = fdiv&0xff;<br /> U0FCR = 0x01; //FIFO控制,BIT <br /> U0LCR = 0x03; <br /> U0IER = 0x01; //必须在DLAB==0时允许接受中断<br />}<br /><br /><br />void Time0Init(void)<br />{<br /> T0TC = 0;<br /> T0PR = 0; //最大值<br /> T0MCR =0x03; //设置匹配后,复位T0TC,并产生中断;<br /> T0MR0 = Fpclk/200;<br /> T0TCR = 0x01; //启动定时器;// <br /> <br /> VICIntEnable |= 1<<4; <br /> VICVectAddr2 = (uint32)InterTime0; <br /> VICVectCntl2 = 0x24; <br />}<br />void Delay(uint32 dly)<br />{<br /> uint32 i;<br /> for(;dly > 0;dly--)<br /> {<br /> for(i=0;i<5000;i++); <br /> }<br />} <br /><br /><br />int main (void) <br />{ <br /> <br /> do<br /> {<br /> <br /> // PINSEL0 = 0x05;<br /> PINSEL0 = 0X5505;<br /> IODIR |= 0xfff<<9; //p0.9-p0.12为输出模式<br /> <br /> IOCLR |= 1<<9; //DENG liang<br /> Delay(5555);<br /> IOSET |= 1<<9; //DENG mei<br /> Delay(5555); //<br /><br /> IODIR |= 1<<30;<br /> <br /> <br /> MSPI_Init(52); ////?????????<br /><br />// MSendData(0x03);<br /> <br /> temp = MSendData(0x03); <br /> <br />// Feed(temp);<br /><br /> Delay(9999);<br /> IOSET |= 1<<30;<br /> <br /> U0FCR = 0x81; //8bit 可改 使能FIFO,并设置触发点为8字节,就是Rx触发<br /> U0IER = 0x01; <br /> IRQEnable(); //IRQ 中断必须开<br /> Uart0Init(); <br />// VICSoftInt =1<<6;<br /> Time0Init();<br /> U0IIR = 0x00; <br /> IOSET |= 1<<10; //打开1838使能<br /> Feed(400); <br /> }<br /> while(1); <br /> return 0;<br />} <br /> |
|