- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
单片机SPI作为从设备通信总结
单片机的SPI作为从设备进行通信
这里运行的实例是单片机作为从设备,采用ARM9作为主设备进行SPI通信。ARM9作为主设备,SPI的通信速率最低为500K,单片机采用NEC 的78F1166,晶振采用11.0592MHz时SPI通信速率可以达到500K。速率匹配上没有问题。
主从设备之间采用的通信协议为DL/645.这里有一个问题,协议的收发数据帧的长度是不确定的。这就涉及到主设备需要读多少个字节的数据。根据实际应用。645规约实际通信时数据帧不会超过100个字节。所以这里解决的方案是,主设备发送命令后,等待200ms后主设备开始抄读数据。这里之所以等待200MS,是因为从设备需要准备数据。
以下是从设备的应用程序:
Unsigned char* gpCsi01RxAddress; /* csi01 receive buffer address */
Unsigned short gCsi01RxLen; /* csi01 receive data length */
Unsigned short gCsi01RxCnt; /* csi01 receive data count */
Unsigned char* gpCsi01TxAddress; /* csi01 send buffer address */
Unsigned short gCsi01TxLen; /* csi01 send data length */
Unsigned short gCsi01TxCnt; /* csi01 send data count */
#define BUFFERLEN 200
unsigned char SPI_RX_Buffer[BUFFERLEN];
unsigned char TxFlag,RxFlag;
unsigned char Data;
unsigned long count = 0;
void CSI01_Init( void )
{
/* CSI01 initial setting */
ST0 |= SAU_CH1_STOP_TRG_ON; /* CSI01 disable */
CSIMK01 = 1; /* INTCSI01 disable */
CSIIF01 = 0; /* INTCSI01 IF clear */
SIR01 = SAU_SIRMN_FECTMN | SAU_SIRMN_PECTMN | SAU_SIRMN_OVCTMN; /* error flag clear */
SMR01 = SAU_SMRMN_INITIALVALUE | SAU_CLOCK_MODE_TI0N | SAU_TRIGGER_SOFTWARE | SAU_CSI | SAU_BUFFER_EMPTY;//SAU_TRANSFER_END;
SCR01 = SAU_RECEPTION_TRANSMISSION | SAU_TIMING_4 | SAU_MSB | SAU_LENGTH_8;
SDR01 = 0;
SO0 = ~SAU_CH1_DATA_OUTPUT_1; /* CSI01 SO initial level */
SOE0 |= SAU_CH1_OUTPUT_ENABLE; /* CSI01 output enable */
/* INTCSI01 priority low */
CSIPR101 = 0;
CSIPR001 = 0;
/* SI01 pin setting */
PM4 |= 0x10;
/* SO01 pin setting */
P4 |= 0x20;
PM4 = ~0x20;
/* SCK01 pin setting */
PM4 |= 0x08;
}
//=================================================================
void CSI01_Start( void )
{
CSIMK01 = 0; /* INTCSI01 enable */
SS0 |= SAU_CH1_START_TRG_ON; /* CSI01 enable */
//gpCsi01RxAddress = SPI_RX_Buffer;//接收数据指针指向SPI_RX_Buffer第一个字节
//gCsi01RxCnt = 0;//接收数据个数清零
//gCsi01TxCnt = 0;//发送数据个数清零
//SetSendFlag(SENDEND);//启动时
文档评论(0)