关于SPI通信问题
时间:10-02
整理:3721RD
点击:
求助~我使用的是STC12C5A60单片机,它自身带有SPI接口,我程序如下:
void main(void)
{
BYTE8bit i;
BYTE8bit temp;
Initial_Uart();
Initial_SPI();
IE2|=ESPI;
//ES=1;
EA=1;
while(1)
{
#ifdef MASTER
ACC=Recv_Uart();
SPISS=0;
SPDAT=ACC;
#endif
}
}
void spi_isr() interrupt 9 using 1
{
SPSTAT=SPIF|WCOL;
#ifdef MASTER
SPISS=1;
Send_Uart(SPDAT);
#else
SPDAT=SPDAT;
#endif
}
void Initial_Uart(void)
{
SCON=0x50; //set UART mode as 8-bit variable baudrate
TMOD|=0x20; //timer1 as 8 bit auto reload mode
AUXR=0x40;
//AUXR=0x10; //BRT enable,s2mod=0,brtX12=0,T1X12=0
//PCON&=0x7F; //SMOD=0
TH1=TL1=0xFD; //11.0592 9600
TR1=1;
}
void Initial_SPI(void)
{
SPDAT=0; //initial SPI data
SPSTAT=SPIF|WCOL; //clear SPI status
SPISS=1;
#ifdef MASTER
SPCTL=SSIG|SPEN|MSTR|CPOL; //master mode
#else
SPCTL=SPEN; //slave mode
#endif
}
void Send_Uart(BYTE8bit dat)
{
SBUF=dat; //send current data
while(!TI) //wait pre-data sent
TI=0; //clear ti flag
}
BYTE8bit Recv_Uart(void)
{
while(!RI);
RI=0;
return SBUF;
}
BYTE8bit SD_Init(void)
{
BYTE8bit retry,temp;
BYTE8bit i;
BYTE8bit CMD[]={0x40,0x00,0x00,0x00,0x00,0x95};
do
{
SPISS=1;
for(i=0;i<10;i++)
{
SPDAT=0xff;
}
temp=Write_Cmd_SD(CMD);
}while((temp!=1)&&(retry<300));
SPISS=1;
return(temp);
}
我直接把从机拿掉想测试MOSI/CLK波形~发现CLK有波形8个周期的波形,但MOSI无输出一直为低电平~
有哪位高人指点一下~
看了网上很多说要设置P口模式,推挽输入,输出或漏极什么的,怎么设置啊?
我把MOSI/CLK设置为推挽输出,MISO设置为输入,结果什么波形都没有,为高电平~
void main(void)
{
BYTE8bit i;
BYTE8bit temp;
Initial_Uart();
Initial_SPI();
IE2|=ESPI;
//ES=1;
EA=1;
while(1)
{
#ifdef MASTER
ACC=Recv_Uart();
SPISS=0;
SPDAT=ACC;
#endif
}
}
void spi_isr() interrupt 9 using 1
{
SPSTAT=SPIF|WCOL;
#ifdef MASTER
SPISS=1;
Send_Uart(SPDAT);
#else
SPDAT=SPDAT;
#endif
}
void Initial_Uart(void)
{
SCON=0x50; //set UART mode as 8-bit variable baudrate
TMOD|=0x20; //timer1 as 8 bit auto reload mode
AUXR=0x40;
//AUXR=0x10; //BRT enable,s2mod=0,brtX12=0,T1X12=0
//PCON&=0x7F; //SMOD=0
TH1=TL1=0xFD; //11.0592 9600
TR1=1;
}
void Initial_SPI(void)
{
SPDAT=0; //initial SPI data
SPSTAT=SPIF|WCOL; //clear SPI status
SPISS=1;
#ifdef MASTER
SPCTL=SSIG|SPEN|MSTR|CPOL; //master mode
#else
SPCTL=SPEN; //slave mode
#endif
}
void Send_Uart(BYTE8bit dat)
{
SBUF=dat; //send current data
while(!TI) //wait pre-data sent
TI=0; //clear ti flag
}
BYTE8bit Recv_Uart(void)
{
while(!RI);
RI=0;
return SBUF;
}
BYTE8bit SD_Init(void)
{
BYTE8bit retry,temp;
BYTE8bit i;
BYTE8bit CMD[]={0x40,0x00,0x00,0x00,0x00,0x95};
do
{
SPISS=1;
for(i=0;i<10;i++)
{
SPDAT=0xff;
}
temp=Write_Cmd_SD(CMD);
}while((temp!=1)&&(retry<300));
SPISS=1;
return(temp);
}
我直接把从机拿掉想测试MOSI/CLK波形~发现CLK有波形8个周期的波形,但MOSI无输出一直为低电平~
有哪位高人指点一下~
看了网上很多说要设置P口模式,推挽输入,输出或漏极什么的,怎么设置啊?
我把MOSI/CLK设置为推挽输出,MISO设置为输入,结果什么波形都没有,为高电平~
额~马虎。问题已解决,测试仪器出问题了~嘻嘻
问题解决就好,还好我向下面看了一下,要不我就又在那想啊想啊。
参考一下
借用下你的程序,老兄