SPI 不通

来源:互联网 发布:仿手写软件 编辑:程序博客网 时间:2024/04/28 12:02

昨天看了x5043的有关资料,大部分看懂了。x5043在每次操作之前都必须有一次cs由高至低的跳变,写入命令、数据、地址之类的通过SI输入,读的时候SO输出

写一字节操作:cs由高至低——写使能命令WREN 06H——cs由高至低——写数据命令WRITE+address+数据——等待——cs由高至低——写禁止命令WRDI 04H

读一字节操作:cs由高至低——写禁止命令WRDI 04H——cs由高至低——读数据命令READ+address——读数据
 
BUT,还是不通,不知道哪里不对啊啊啊~~

我试了一下,uart是可以接收传送数据的,所以uart这一块是没有问题的,那就可能是spi和x5043的问题了,可是找不到什么问题啊

1、昨天你说“IO1DIR|=SPI_CS; IO1CLR|=SPI_CS; 有问题吧?”是哪里有问题?我感觉是对的啊,纠结。

 2、上一篇文章里面写了x5043的IO模拟程序,里面有个写状态函数,我在我的程序里面没有应用这个函数,不知道是不是有影响,我感觉好像没有影响

3、我对照了资料上的SPI主机发送接收的设置,感觉自己是对的啊,除了一点他直接return(SPDR)读回数据寄存器,而我是通过读x5043的操作读回的数据的

大哭

#include "config.h"
#define BPS 9600

uint32 SP485_DE=1<<17; //rs485使能
uint32 SPI_CS=1<<24; //x5043使能
uint8 SPI_rcv,Uart_rcv;


void InitSPI(void);
void InitUart(void);
void MSPI_SendByte(uint8 data);

uint8 rdsr_x5043(void);
void WaitWrite_x5043(void);
uint8 Read_x5043(uint16 addr);
void Write_x5043(uint16 addr,uint8 n);

void Delay (uint32 dly);

int main (void)
{// add user source code
 InitSPI();
 InitUart();
 
    while(1)
    {
     while((U0LSR & 0x01) == 0);//用串口调试助手发送一字节数据0x03
     Uart_rcv=U0RBR;
    
     Write_x5043(0x00ff,Uart_rcv);// 向x5043写一字节数据    
     SPI_rcv=Read_x5043(0x00ff); //读x5043写一字节数据
         
     IO0SET|=SP485_DE;
     U0THR = SPI_rcv;             //用串口调试助手接收SPI读回的数据
     while((U0LSR & 0x40) == 0);    
     IO0CLR|=SP485_DE;
    
    
    }
    return 0;
}

void InitSPI(void)
{
 PINSEL0=(PINSEL0&(~(0xff<<8)))|(0x55<<8);//管脚功能选择
 SPCCR=0x52;  //设置SPI时钟分频
 SPCR=(0<<3)|(1<<4)|(1<<5)|(0<<6)|(0<<7); //控制器设置
 IO1DIR|=SPI_CS;  //CS管脚为输出
 IO1CLR|=SPI_CS; //先将cs拉低
}

void MSPI_SendByte(uint8 data)
{
 SPDR=data;
 while(0==(SPSR&0x80));
 //return(SPDR);
}

void InitUart(void)
{
 uint16 Fdiv;
   
    PINSEL0=(PINSEL0&(~0x0f))|0x05;
    IO0DIR|=SP485_DE;
    IO0CLR|=SP485_DE;
  
    U0LCR = 0x83 ;//允许设置波特率
    Fdiv = (Fpclk / 16) /BPS;
    U0DLM = Fdiv /256;
    U0DLL = Fdiv % 256;
    U0LCR = 0x03;
   
}


uint8 rdsr_x5043(void)  //读x5043状态寄存器
{
 uint8 n;
 IO1SET|=SPI_CS;
 Delay(1);
 IO1CLR|=SPI_CS;
 MSPI_SendByte(0x04);//写禁止
 
 IO1SET|=SPI_CS;
 Delay(1);
 IO1CLR|=SPI_CS;
 MSPI_SendByte(0x05);//读状态
 n=SPDR;
 return(n);
 
 
}
void WaitWrite_x5043(void)
{
 uint8 i;
 for(i=0;i<=99;i++)
 {
  if((rdsr_x5043()&0x01)==0x00)
   break;
 }
}
uint8 Read_x5043(uint16 addr)
{
 uint8 n;
    n = 0x03;    /* 0000 (A8)011 READ */
    if ( ( addr & 0x0100 ) != 0 )
        n = ( n | 0x08 );
       
 IO1SET|=SPI_CS;
 Delay(1);
 IO1CLR|=SPI_CS;
 MSPI_SendByte(0x04);//写禁止
 
 IO1SET|=SPI_CS;
 Delay(1);
 IO1CLR|=SPI_CS;
 MSPI_SendByte(n);//读
 MSPI_SendByte((uint8)addr);
 
 n=SPDR;
 return(n);
}

void Write_x5043(uint16 addr,uint8 n)//地址+数据
{
 uint8 i;
    if(Read_x5043(addr)==n)
        return;
    i = 0x02;                               /* 0000 (A8)010 WRITE */
    if((addr & 0x0100 )!= 0)
       i=(i|0x08);
      
 IO1SET|=SPI_CS;
 Delay(1); 
 IO1CLR|=SPI_CS;
    MSPI_SendByte(0x06);
   
    IO1SET|=SPI_CS;
    Delay(1);   
    IO1CLR|=SPI_CS;
    MSPI_SendByte(i);//写使能
    MSPI_SendByte((uint8)addr);
    MSPI_SendByte(n);//写数据
    WaitWrite_x5043();
   
    IO1SET|=SPI_CS;
    Delay(1);   
    IO1CLR|=SPI_CS;
    MSPI_SendByte(0x04);//写禁止
}
void Delay (uint32 dly)
{
     uint32 i; 
     for ( ; dly>0; dly--)
          for (i=0; i<1; i++);
}

原创粉丝点击