SPI 不通
来源:互联网 发布:仿手写软件 编辑:程序博客网 时间:2024/04/28 12:02
昨天看了x5043的有关资料,大部分看懂了。x5043在每次操作之前都必须有一次cs由高至低的跳变,写入命令、数据、地址之类的通过SI输入,读的时候SO输出
我试了一下,uart是可以接收传送数据的,所以uart这一块是没有问题的,那就可能是spi和x5043的问题了,可是找不到什么问题啊
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++);
}
- SPI 不通
- SPI
- SPI
- SPI
- SPI
- SPI
- SPI
- SPI
- spi
- spi
- SPI
- SPI
- spi
- SPI
- SPI
- spi
- SPI
- SPI
- 打开组策略,提示MMC无法创建管理单元 解决方法
- JMX的简单示例
- java基础问题---什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。
- Android进程 Handler Message Looper
- (转)动态转移预测
- SPI 不通
- java基础问题----------TreeSet里面放对象,如果同时放入了父类和子类的实例对象
- Android应用程序四大组件
- 主函数 main WinMain _tmain _tWinMain 的区别
- java基础问题------ArrayList和Vector的区别
- 安装PHP调试库PHP DBG (文章纯属引用)
- 关于while循环
- LINUX常用命令备忘
- Eclipse中DTD验证导致无法进行代码提示的问题