|
以前没有仔细看过SPI,只是把原有的代码搬来使用。不久前想重新写代码才发现Datasheet中SPI主机模式的例子其实有误区:
void SPI_MasterInit(void)
{
/* 设置MOSI 和SCK 为输出,其他为输入 */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* 使能SPI 主机模式,设置时钟速率为fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
可是实际上,如果这样设置要传送数据,几乎是不能工作的。在示波器上没有任何信号输出。郁闷了好久,才发现,还应该设置SS引脚为输出,或输入且拉高。仔细查看Datasheet,有如下说明:
“当SPI 配置为主机时(MSTR 的SPCR 置位),用户可以决定SS 引脚的方向。若SS 配置为输出,则此引脚可以用作普通的I/O 口而不影响SPI 系统。典型应用是用来驱动从机的SS 引脚。
如果SS 配置为输入,必须保持为高以保证SPI 的正常工作。若系统配置为主机, SS 为输入,但被外设拉低,则SPI 系统会将此低电平解释为有一个外部主机将自己选择为从机。为了防止总线冲突, SPI 系统将实现如下动作:
1. 清零SPCR 的MSTR 位,使SPI 成为从机,从而MOSI 和SCK 变为输入。
2. SPSR 的SPIF 置位。若SPI 中断和全局中断开放,则中断服务程序将得到执行。
”
晕,搞了我好几个钟头。
-----此内容被testcode于2005-06-18,01:41:23编辑过 |
|