{
RF_NSEL = 0 // 片选拉低启动SPI通讯
SPI0DAT = (reg|0x80) // 写入1个字节的寄存器地址
while( SPIF == 0) // 等待SPI传输完成
SPIF = 0
SPI0DAT = value // 继续写入第二个字节(寄存器值)
while( SPIF == 0) // 等待SPI传输完成
SPIF = 0
RF_NSEL = 1 // 片选拉高结束SPI通讯
}
//-----------------------------------------------------------------------------
//函数描述: SPI读取函数
//相关参数:
//返回信息:
//
//-----------------------------------------------------------------------------
uchar SpiReadRegister (uchar reg)
{
RF_NSEL = 0// 片选拉低启动SPI通讯
SPI0DAT = reg // 写入1个字节的寄存器地址
while( SPIF == 0) // 等待SPI传输完成
SPIF = 0
SPI0DAT = 0xFF // 写一个Dummy字节(因为要读取的话必须用写入来启动一个交换数据的传输),当写入完成后从机的数据也完成了读入。
while( SPIF == 0) // 等待SPI传输配段完成
SPIF = 0
RF_NSEL = 1 // 片选拉高结束SPI通讯
return SPI0DAT// 返回读取的值(在SPI0DAT=0xFF中完成读取)
}
需要注意的是读写 *** 作实际上完成的都是数据的交换,即主机传送1个字节给从机,从机同时传送1个字节给主机。所以读 *** 作看起来像是写数据,但实际上培没誉写入完成后就可以从SPI0DAT中获得从机的察销应答数据了。
用变量存储SPI数据unsigned char a
a = SPI_Trans(0x04)
eeprom_write_byte(address,a)
SPI主机机读数据毕镇需要发送数据置换即通手悄粗讯程主机SPDR数据送机SPDR机SPDR数据送主机
面代码供参考:
初始化SPI主机使用断模式3速度于2MHzSCKMOSISS脚输
接低运则ss选器件
SPI_Trans(0x0a)//发送址高8位
SPI_Trans(0xff)//凑足16位意义
a = SPI_Trans(0xff)//读入数据高8位
eeprom_busy_wait()
eeprom_write_byte(address,a)//写入eeprom
a = SPI_Trans(0xff)//读入数据低8位
eeprom_busy_wait()
eeprom_write_byte(address,a)//写入eeprom
拉高SS释放器件
ADIS16364读命令址16位读数据内容发送完址接16位现:
另外ADIS16364款器件datasheet给图表显示支持SPI通信模式3(CPOL=1,CPHA=1)程序配置模型0
SPI协议中接收和发送数据是一体的,数据传输咐渗世的线路为一个循环链路(loop).如果主机发送数据给衡肢从机,则必须从从机读取数据(即从机也发送数据到主机).同理,如果主机读取从机发来的数据,也必须同时喊扰发送数据给从机.总之,同一个时钟周期内,读和写2个 *** 作都必须执行.欢迎分享,转载请注明来源:内存溢出
评论列表(0条)