完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1. 需要的资源
3. 定义结构体 typedef struct _SPI_CONFIG_t { unsigned int Delay; unsigned char (*MISO_STA)(void); //获取MISO的IO状态 void (*MOSI_IO_HIGH)(void); //MOSI的IO设置成高 void (*MOSI_IO_LOW)(void); //MOSI的IO设置成低 void (*CS_IO_HIGH)(void); //CS的IO设置成高 void (*CS_IO_LOW)(void); //CS的IO设置成低 void (*CLK_IO_HIGH)(void); //CLK的IO设置成高 void (*CLK_IO_LOW)(void); //CLK的IO设置成低 }SPI_CONFIG_t; 4. 函数功能 void _SPI_Delay(unsigned int n) { unsigned int t; t=n; while(t--); } #if SPI_CPOL==0 && SPI_CPHA==0 /* ********************************************************************************************************* * 函 数 名: CS_Enable * 形 参: spi * 返 回 值: 无 * 功能说明: 片选使能 ********************************************************************************************************* */ void CS_Enable(SPI_CONFIG_t spi) { spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); spi.CS_IO_LOW(); _SPI_Delay(spi.Delay); } /* ********************************************************************************************************* * 函 数 名: CS_Disable * 形 参: spi * 返 回 值: 无 * 功能说明: 片选失能 ********************************************************************************************************* */ void CS_Disable(SPI_CONFIG_t spi) { spi.CS_IO_HIGH(); _SPI_Delay(spi.Delay); spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); } /* ********************************************************************************************************* * 函 数 名: SPI_WriteByte * 形 参: spi; dat:写入的数据 * 返 回 值: 无 * 功能说明: spi写入一个字节的时序 ********************************************************************************************************* */ void SPI_WriteByte(SPI_CONFIG_t spi, unsigned char dat) { unsigned char i=0; for(i=0;i<8;i++) { if(dat&0x80) spi.MOSI_IO_HIGH(); else spi.MOSI_IO_LOW(); _SPI_Delay(spi.Delay); dat<<=1; spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); } } /* ********************************************************************************************************* * 函 数 名: SPI_ReadByte * 形 参: spi; * 返 回 值: spi读一个字节 * 功能说明: spi读一个字节的时序 ********************************************************************************************************* */ unsigned char SPI_ReadByte(SPI_CONFIG_t spi) { unsigned char i=0,dat=0; for(i=0;i<8;i++) { spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); dat<<=1; if(spi.MISO_STA()) dat |= 0x01; _SPI_Delay(spi.Delay); spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); } return dat; } /* ********************************************************************************************************* * 函 数 名: SPI_WRByte * 形 参: spi; wdat:写入的数据 * 返 回 值: spi读一个字节 * 功能说明: spi同时读写一个字节的时序 ********************************************************************************************************* */ unsigned char SPI_WRByte(SPI_CONFIG_t spi, unsigned char wdat) { unsigned char i=0,rdat=0; for(i=0;i<8;i++) { if(wdat&0x80) spi.MOSI_IO_HIGH(); else spi.MOSI_IO_LOW(); _SPI_Delay(spi.Delay); wdat<<=1; spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); rdat<<=1; if(spi.MISO_STA()) rdat |= 0x01; _SPI_Delay(spi.Delay); spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); } return rdat; } #endif #if SPI_CPOL==1 && SPI_CPHA==0 void CS_Enable(SPI_CONFIG_t spi) { spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); spi.CS_IO_LOW(); _SPI_Delay(spi.Delay); } void CS_Disable(SPI_CONFIG_t spi) { spi.CS_IO_HIGH(); _SPI_Delay(spi.Delay); spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); } void SPI_WriteByte(SPI_CONFIG_t spi, unsigned char dat) { unsigned char i=0; for(i=0;i<8;i++) { if(dat&0x80) spi.MOSI_IO_HIGH(); else spi.MOSI_IO_LOW(); _SPI_Delay(spi.Delay); dat<<=1; spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); } } unsigned char SPI_ReadByte(SPI_CONFIG_t spi) { unsigned char i=0,dat=0; for(i=0;i<8;i++) { spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); dat<<=1; if(spi.MISO_STA()) dat |= 0x01; _SPI_Delay(spi.Delay); spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); } return dat; } unsigned char SPI_WRByte(SPI_CONFIG_t spi, unsigned char wdat) { unsigned char i=0,rdat=0; for(i=0;i<8;i++) { if(wdat&0x80) spi.MOSI_IO_HIGH(); else spi.MOSI_IO_LOW(); _SPI_Delay(spi.Delay); wdat<<=1; spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); rdat<<=1; if(spi.MISO_STA()) rdat |= 0x01; _SPI_Delay(spi.Delay); spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); } return rdat; } #endif #if SPI_CPOL==0 && SPI_CPHA==1 void CS_Enable(SPI_CONFIG_t spi) { spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); spi.CS_IO_LOW(); _SPI_Delay(spi.Delay); } void CS_Disable(SPI_CONFIG_t spi) { spi.CS_IO_HIGH(); _SPI_Delay(spi.Delay); spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); } void SPI_WriteByte(unsigned char dat) { unsigned char i=0; for(i=0;i<8;i++) { spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); if(wdat&0x80) spi.MOSI_IO_HIGH(); else spi.MOSI_IO_LOW(); _SPI_Delay(spi.Delay); dat<<=1; spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); } } unsigned char SPI_ReadByte(void) { unsigned char i=0,dat=0; for(i=0;i<8;i++) { spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); dat<<=1; if(MISO_STA) dat |= 0x01; _SPI_Delay(spi.Delay); } } unsigned char SPI_WRByte(unsigned char wdat) { unsigned char i=0,rdat=0; for(i=0;i<8;i++) { spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); if(wdat&0x80) spi.MOSI_IO_HIGH(); else spi.MOSI_IO_LOW(); _SPI_Delay(spi.Delay); spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); rdat<<=1; if(MISO_STA) rdat |= 0x01; _SPI_Delay(spi.Delay); } } #endif #if SPI_CPOL==1 && SPI_CPHA==1 void CS_Enable(SPI_CONFIG_t spi) { spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); spi.CS_IO_LOW(); _SPI_Delay(spi.Delay); } void CS_Disable(SPI_CONFIG_t spi) { spi.CS_IO_HIGH(); _SPI_Delay(spi.Delay); spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); } void SPI_WriteByte(unsigned char dat) { unsigned char i=0; for(i=0;i<8;i++) { spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); if(wdat&0x80) spi.MOSI_IO_HIGH(); else spi.MOSI_IO_LOW(); _SPI_Delay(spi.Delay); dat<<=1; spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); } } unsigned char SPI_ReadByte(void) { unsigned char i=0,dat=0; for(i=0;i<8;i++) { spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); dat<<=1; if(MISO_STA) dat |= 0x01; _SPI_Delay(spi.Delay); } } unsigned char SPI_WRByte(unsigned char wdat) { unsigned char i=0,rdat=0; for(i=0;i<8;i++) { spi.CLK_IO_LOW(); _SPI_Delay(spi.Delay); if(wdat&0x80) spi.MOSI_IO_HIGH(); else spi.MOSI_IO_LOW(); _SPI_Delay(spi.Delay); spi.CLK_IO_HIGH(); _SPI_Delay(spi.Delay); rdat<<=1; if(MISO_STA) rdat |= 0x01; _SPI_Delay(spi.Delay); } } #endif /* ********************************************************************************************************* * 函 数 名: SPI_WriteOneData * 形 参: spi; wdat:写入的数据 * 返 回 值: 无 * 功能说明: spi写入一个字节 ********************************************************************************************************* */ void SPI_WriteOneData(SPI_CONFIG_t spi, unsigned char wdat) { CS_Enable(spi); SPI_WriteByte(spi,wdat); CS_Disable(spi); } /* ********************************************************************************************************* * 函 数 名: SPI_ReadOneData * 形 参: spi; * 返 回 值: 读取一个字节 * 功能说明: spi读取一个字节 ********************************************************************************************************* */ unsigned char SPI_ReadOneData(SPI_CONFIG_t spi) { unsigned char rdat=0; CS_Enable(spi); rdat = SPI_ReadByte(spi); CS_Disable(spi); return rdat; } /* ********************************************************************************************************* * 函 数 名: SPI_WROneData * 形 参: spi; wdat:写入的数据 * 返 回 值: spi读一个字节 * 功能说明: spi同时读写一个字节 ********************************************************************************************************* */ unsigned char SPI_WROneData(SPI_CONFIG_t spi, unsigned char wdat) { unsigned char rdat=0; CS_Enable(spi); rdat = SPI_WRByte(spi,wdat); CS_Disable(spi); return rdat; } /* ********************************************************************************************************* * 函 数 名: SPI_Write_Buf * 形 参: spi; wdat:写入的数据; len:读取写入字节数 * 返 回 值: 无 * 功能说明: spi写多个字节 ********************************************************************************************************* */ void SPI_Write_Buf(SPI_CONFIG_t spi, unsigned char* wdat, unsigned char len) { unsigned char i=0; CS_Enable(spi); for(i=0;i CS_Disable(spi); } /* ********************************************************************************************************* * 函 数 名: SPI_Read_Buf * 形 参: spi; rdat:读取的数据; len:读取字节数 * 返 回 值: 无 * 功能说明: spi读多个字节 ********************************************************************************************************* */ void SPI_Read_Buf(SPI_CONFIG_t spi, unsigned char* rdat, unsigned char len) { unsigned char i=0; CS_Enable(spi); for(i=0;i CS_Disable(spi); } /* ********************************************************************************************************* * 函 数 名: SPI_WR_Buf * 形 参: spi; wdat:写入的数据; rdat:读取的数据; len:读取写入字节数 * 返 回 值: 无 * 功能说明: spi同时读写多个字节 ********************************************************************************************************* */ void SPI_WR_Buf(SPI_CONFIG_t spi, unsigned char* wdat,unsigned char* rdat, unsigned char len) { unsigned char i=0; CS_Enable(spi); for(i=0;i CS_Disable(spi); } |
|
|
|
只有小组成员才能发言,加入小组>>
3324 浏览 9 评论
3003 浏览 16 评论
3500 浏览 1 评论
9077 浏览 16 评论
4095 浏览 18 评论
1208浏览 3评论
617浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
606浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2345浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1905浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-1 09:23 , Processed in 0.805084 second(s), Total 46, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号