浏览CS5464英文手册的第12页,我们观察到下图,这就是CS5464的读写时序图。
CS是片选管脚,当该管脚为低电平时表明该芯片在选中状态。SDO、SDI、SCLK的电平变化会被cs5464接收。负责SDO、SDI、SCLK会被忽略。
在写cs5464时SDI的数据在SCLK的上升沿数据被cs5464接收。先写地址、再写数据。
在读取cs5464时SDI的数据在SCLK的上升沿数据被cs5464接收。先写地址、 再接收数据。
其实这是一个标准的SPI总线。
实现的代码如下:
/********************************************
功能: 接收CS5460A送出一个字节数据
参数:无
返回:接收到一个字节数据
********************************************/
unsigned char Read_CS5464_Byte( )
{
unsigned char i,dat;
dat=0x00;
CS5464_SDO =1;
for(i=0; i<8; i++)
{
CS5464_CLK = 0;
_nop_( ); _nop_( );
CS5464_CLK = 1;
if(CS5464_SDO)
{
dat = dat|(0x80>>i);
}
}
return dat;
}
/********************************************
功能:向CS5460A发送一个字节
参数:dat 需要发送的数据
返回:无
********************************************/
void Write_CS5464_Byte(unsigned char dat)
{
unsigned char i;
CS5464_CLK = 0;
_nop_( ); _nop_( );
for(i=0; i<8; i++) //发送8bit数据
{
CS5464_CLK = 0;
_nop_( ); _nop_( );
CS5464_SDI = (dat & 0x80)>>7; //发送字节顺序先高后低
dat = dat<<1;
CS5464_CLK =1;
_nop_( ); _nop_( );
}
CS5464_CLK = 0;
_nop_( ); _nop_( );
}
/********************************************
功能: 读取Cs5464A寄存器中数据
参数:address,寄存器地址,buff接收数据缓冲区
返回:无
********************************************/
void Read_5464(unsigned char address, unsigned char *buff)
{
unsigned char i;
CS5464_CS =1;
_nop_( );
CS5464_CLK = 0;
_nop_( );
CS5464_CS =0;
_nop_( );
Write_CS5464_Byte(address);//发送地址
CS5464_SDI =1;
for(i=0; i<3; i++)
{
*(buff+i) = Read_CS5464_Byte( );
}
CS5464_CLK = 0;
CS5464_SDI = 0;
CS5464_CS = 1;
}
/****************************************************
功能: 将buff缓冲区的数据发向CS5460A
参数:buff 数据缓冲区,发送字节数
返回:无
******************************************************/
void Write_CS5464(unsigned char *buff,unsigned char n)
{
unsigned char i;
CS5464_CS =1;
CS5464_CLK = 0;
CS5464_CS =0;
for(i=0; i<n;i++)< p="">
{
Write_CS5464_Byte(*(buff+i));
}
CS5464_CLK = 0;
CS5464_SDI =1;
CS5464_CS =1;
}
我们已经实现了CS5464 的总线操作代码。下一节我们了解一下CS5464的寄存器!