完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
工程师们好,我在使用PIC24单片机与ADXL362使用SPI通信时出现了读取数据错误的问题,因此想请教一下。
我在读取相应寄存器的值得时候,数据总是在最后三位或者两位出错,但是又没有错得很多,比如我写入0xFA读出来是0xF8,写入0x96读出来是0x94,包括器件ID也是读取时有几位出错,我一开始不知道是写的程序出了问题还是读的,就尝试写入了软复位0x52到软复位寄存器,结果读取出来之前写过的其他寄存器的值都被置0了,我认为可能是读取的问题,但是不知道出错在哪,我尝试调整过主机的分频比,有时候调到某个值就能正确读取,但是过一段时间相同的程序又无法正确读取,而且每次错误读取的值都是一样的,并非随机的代码,不知道有哪位能够帮助一下?以下附上SPI部分的代码,新手代码写得不好请包涵: #include #include "XL362.h" #include "xl362_io.h" unsigned char RESERED[100]; /* reseve zone for ICD2 */ #define CS_SPI _RG9 void delay(unsigned int del); unsigned char b; unsigned char a; void SPI2Init(); unsigned char WriteSPI2Buf(unsigned char k); unsigned char xl362_read(unsigned char addr); void xl362_wr(unsigned char addr,unsigned char data); void xl362_init(); int main(void) { TRISD = 0x0000; TRISF = 0x0000; init(); SPI2Init(); xl362_init(); b=xl362_read(0x00); a=xl362_read(0x01); while(1) { display(); delay(10); } } void delay(unsigned int del) { unsigned int i; while (del --) { for (i = 0; i < 890; i++); } } /*=====================SPI===================*/ void SPI2Init() { IEC2bits.SPI2IE=0; SPI2CON1 =0x033f; //CKE=1 CKP =0 主控模式 SPI2CON2 = 0; SPI2CON1bits.SPRE=0b000; //8:1 辅助 SPI2CON1bits.PPRE=0b10; //4:1 主 SPI2STAT =0x8000; //使能 TRISGbits.TRISG9 =0; CS_SPI = 1; } unsigned char WriteSPI2Buf(unsigned char k) { delay(1); SPI2BUF=k; //写入需要发送的数据 while(!SPI2STATbits.SPIRBF); //等待发送和接受完成 return SPI2BUF; //返回接收的数据 delay(1); } unsigned char xl362_read(unsigned char addr) { uchar k; delay(1); CS_SPI=0; delay(1); k=WriteSPI2Buf(XL362_REG_READ); k=WriteSPI2Buf(addr); k=WriteSPI2Buf(0xff); delay(1); CS_SPI=1; delay(1); return k; } void xl362_wr(unsigned char addr,unsigned char data) { uchar k; delay(1); CS_SPI=0; delay(1); k=WriteSPI2Buf(XL362_REG_WRITE); k=WriteSPI2Buf(addr); k=WriteSPI2Buf(data); CS_SPI=1; } void xl362_init() { // xl362_wr(0x20,0xFA); // xl362_wr(0x21,0x00); // xl362_wr(0x23,0x96); // xl362_wr(0x24,0x00); // xl362_wr(0x25,0x1E); // xl362_wr(0x27,0x3F); // xl362_wr(0x2B,0x40); // xl362_wr(0x2D,0x0A); // xl362_wr(0x1f,0x52); } |
|
相关推荐
4个回答
|
|
您好。建议您使用示波器检查一下通信的时序,注意时钟信号的相位和极性。您可以将时序信号贴出来看一下
|
|
|
|
感谢回复,问题已解决,是信号线接触不良的问题 |
|
|
|
你好,我最近在用ADXL362,但是每次读取了寄存器的值之后它的地址就自动的增加了,如果循环读取一个寄存器的值,读出来的值都不一样,请问你知道是什么原因吗? |
|
|
|
ssqq1980 发表于 2018-11-29 14:24 您好。如果您使用的是burst的读取方式的话,读取的寄存器地址是变化的。如果您要循环读取一个寄存器,可以使用单次的读取。请参考数据手册上图36到图40的命令 |
|
|
|
只有小组成员才能发言,加入小组>>
400 浏览 0 评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1299 浏览 2 评论
ADP5092 SYS端口为2.09V,但是REG_OUT为0是什么原因?
1897 浏览 1 评论
ad7193差分输入ain1与ain2差是正值时,读到电压与实际值误差小,但为负值值,误差就变的很大
4237 浏览 2 评论
8997 浏览 1 评论
ADC3442采集,分析数据出现有规则毛刺,请问是哪方面的问题啊?
1422浏览 3评论
AD7190状态寄存器一直是0x80,连续转换模式下RDY不拉低
1645浏览 2评论
1616浏览 2评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1300浏览 2评论
213浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 00:45 , Processed in 1.847372 second(s), Total 85, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号