at91sam7x256与ads1256/ads1255的SPI通讯

本文档详细介绍了如何使用AT91SAM7X256的SPI0接口与TI公司的ADS1256/ADS1255进行通讯。内容包括SPI0的初始化、ADS1256/ADS1255的操作函数,如读写数据、设置同步和唤醒等。同时,文中提到了在实现过程中遇到的问题及解决方法,如SPI读写操作的注意事项、波特率匹配和硬件检查等。

at91sam7x256通过SPI0控制SPI接口的LCD,按照开发板的iar例程,移植到keil中很轻松的搞定了。

可是at91sam7x256与TI公司的ads1256/ads1255通讯搞了两周始终有这样那样的问题,

现在通讯基本上正常了,当然还有些细节问题需要解决。

//at91sam7x256的SPI0初始化

void Init_SPI0(void)
{
 GPIO_A->PIO_OER  |=MOSI0 |MISO0 |SCLK0;//PA16,PA17,PA18设置为输出 
 GPIO_A->PIO_SODR |=MOSI0 |MISO0 |SCLK0; //PA16,PA17,PA18设置为高
 //开发板片选用
 GPIO_A->PIO_OER  |=(1<<9)|(1<<12)|(1<<15)|SPI0CS1 |SPI0CS2 |SPI0CS3;//PA16,PA17,PA18设置为输出 
 GPIO_A->PIO_SODR |=(1<<9)|(1<<12)|(1<<15)|SPI0CS1 |SPI0CS2 |SPI0CS3; //PA16,PA17,PA18设置为高 

 *AT91C_PMC_PCER  |= (unsigned int)1<<AT91C_ID_SPI0;                  //允许US0口的时钟
 GPIO_A->PIO_PDR  |=MOSI0 |MISO0 |SCLK0; //PA16,PA17,PA18设为外设
 GPIO_A->PIO_ASR  |=MOSI0 |MISO0 |SCLK0; //PA16,PA17,PA18设为外设A
 //开发板片选用
 GPIO_A->PIO_PDR  |=SPI0CS1 |SPI0CS2 |SPI0CS3; //PA16,PA17,PA18设为外设
 GPIO_A->PIO_ASR  |=SPI0CS1 |SPI0CS2 |SPI0CS3; //PA16,PA17,PA18设为外设A
//复位SPI0
 AT91F_SPI_Reset(AT91C_BASE_SPI0);
 AT91F_SPI_Reset(AT91C_BASE_SPI0);

//配置 SPI0 工作在主模式--固定外设--NPCS3片选 //如果选用不同的片选可在此处修改
 AT91F_SPI_CfgMode(AT91C_BASE_SPI0, AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | (0x7<<16));//  |AT91C_SPI_FDIV

    //* 配置8 位数据位 NPCS3-片选3

 AT91F_SPI_CfgCs(AT91C_BASE_SPI0,3,  AT91C_SPI_BITS_8|AT91C_SPI_CSAAT|((AT91B_MCK/(2*400000)) << 8));

//AT91C_SPI_NCPHA|AT91C_SPI_CPOL,按照ADS1255数据手册上 CPHA=1,CPOL=0;AT91C_SPI_NCPHA是需要的,但是实际如果AT91C_SPI_NCPHA这位加上的话通讯是不正常的,现在设置是CPHA=0,CPOL=0;这个还需要再研究一下数据手册的内容。

时钟频率按照at91sam7x256数据手册上应该是

  图片
可是我设置波特率为400k的时候通讯是不正常的,计算的时候安装800k=2×400k通讯正常了,是我波特率设置太低了,还是手册有问题啊,ADS1255 的spi波特率书上说300k~500k之间比较合适,我设置的大于600k=2×300k才能正常通讯。还没有搞清楚,反正设置能用了。

     //* 启动 SPI0           
       AT91F_SPI_Enable(AT91C_BASE_SPI0);
 //使用pdc,目前程序没有使用PDC,所以下面代码屏蔽掉了
 //   AT91F_PDC_Open(AT91C_BASE_PDC_SPI0);
 //   AT91C_BASE_SPI0->SPI_PTCR = AT91C_PDC_TXTEN + AT91C_PDC_RXTEN;
}
//-----------------------------------------------------------------

//spi写一个字节,写前后我都读了一次spi——SPI_RDR寄存,如果不读,读写ADS1255寄存器就不对,这个是我对spi通讯协议的基本内容不太理解,先这样写了,反正能用。
void SPI_Write(AT91PS_SPI spi, unsigned int npcs, unsigned int data)
{
    unsigned int temp=spi->SPI_RDR; 
    temp=data | SPI_PCS(npcs);
    while ((spi->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
    spi->SPI_TDR =temp;
    while ((spi->SPI_SR & AT91C_SPI_TDRE) == 0);
 temp=spi->SPI_RDR;
 
}

//------------------------------------------------------------------------

//从spi读出一个字节数据,读取之前先要写spi->SPI_TDR,不然读的数据是FF,或者不能读。
unsigned short SPI_Read(AT91S_SPI *spi)
{
   unsigned int i;
    while ((spi->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
    spi->SPI_TDR = 0xffff|0xb0000;
    while ((spi->SPI_SR & AT91C_SPI_RDRF) == 0); 
    return spi->SPI_RDR & 0xffff;
}

//===================================================================

 下面是对ADS1255的操作函数

#include <AT91SAM7X256.H>

#inc

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值