这个spi不用模拟,avr带这个接口,直接用它提供的代码。手册上有。
void SPI_MasterInit(void)
{
/ 设置MOSI 和SCK 为输出,其他为输入 /
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/ 使能SPI 主机模式,设置时钟速率为fck/16 /
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
/ 启动数据传输 /
SPDR = cData;
/ 等待传输结束 /
while(!(SPSR & (1<<SPIF)))
;
}
void SPI_SlaveInit(void)
{
/ 设置MISO 为输出,其他为输入 /
DDR_SPI = (1<<DD_MISO);
/ 使能 SPI /
SPCR = (1<<SPE);
}
char SPI_SlaveReceive(void)
{
/ 等待接收结束 /
while(!(SPSR & (1<<SPIF)))
;
/ 返回数据 /
return SPDR;
}
用传统的51单片机实现SPI通讯,需要用I/O脚来模拟SPI协议,这比较麻烦。
选用STC8系列单片机,就具有了SPI接口了 ,只需要对寄存器 *** 作就行了。方便了很多了。如下图,这是STC8系列中的4个子系列,还有其它的子系列,就不再列举了。
你读写的东西是只传一个字节就可以了吗?若是命令或寄存器地址一般都是不只两个字节,CS应该持续为低,知道写完命令或寄存器地址。不知道是不是这个问题。还有这read函数我是没看懂啊,连个MISO都没有啊
这要看你用的是硬件SPI还是软件模拟SPI,如果是硬件SPI,也就是单片机自带SPI模块,只要写相应的寄存器就可以,单片机应该有确定的SPI口,与从机(或主机)一一相连就可以了。如果是软件模拟SPI,也就是通过IO口模拟SPI时序,随便四个可以输入输出的IO口就可以。
以下的设置,有没有毛病? 是不是 0xEC 才对?
void spi_comm_init()
{
SPCTL = 0xFC; // SSIG,SPEN,DORD,MSTR,CPOL,CPHA,SPR1,SPR0。 1110,1100
以上就是关于avr单片机模拟spi程序 主机给从机传数据,求教下主机和从机的程序全部的内容,包括:avr单片机模拟spi程序 主机给从机传数据,求教下主机和从机的程序、51单片机怎样实现SPI通讯、51单片机 模拟4线SPI读写问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)