|
500黑幣
MXA5481為10位(0~1023)可編程數字電位器(10k)
看數據手冊,本覺得這個芯片比較簡單,就三個命令字:
①、cmd=0x00:設置中間抽頭位置
②、cmd=0x20:將當前抽頭位置復制到NV非易失去寄存器(掉電數據不丟失)
③、cmd=0x30:將NV非易失去寄存器的值設置為中間抽頭位置
用萬用表測量RWH和RWL的電阻都是4.5K左右, 無論怎么改變code的值,滑動變阻器兩端的阻值都沒變化
主要問題:懷疑是SPI數據未寫進IC里,但是我用示波器看時序如圖(5),寫的數據和程序寫的是一樣
幫忙看下程序的時序是否有問題。
故障排除:
1、主程序中下面兩句程序是否能把寫的值保存在NV寄存器中
MAX5481_Write_Wiper_Reg(0X00,0x0200);
MAX5481_Wtite_Cmd(0x20); 還是要再加一條語句:
MAX5481_Write_Wiper_Reg(0X00,0x0200);
MAX5481_Wtite_Cmd(0x20);
MAX5481_Wtite_Cmd(0x30);
2、SPI通訊排線20cm左右(線是否過長?)
3、MCU為5V/3.3V,MAX5481 +-2.5V(主從供電電壓不一樣是否對通訊有影響?)
4、數據手冊第4頁SCLK Frequency max(7M),MCU用的12M(時鐘是否過快導致數據寫不進去?)
5、數據手冊第9頁,要使用SPI模式,IC第6腳必須置高電平(MCU 控制MXA5481_SPI=1,還是直接接電源+5V/3.3V?)
原理圖:圖(1)
3.png (43.08 KB, 下載次數: 59)
下載附件
2023-10-28 17:17 上傳
命令字和時序圖:
圖(2)
1.png (136.19 KB, 下載次數: 55)
下載附件
2023-10-28 17:17 上傳
圖(3)
2.png (76.76 KB, 下載次數: 74)
下載附件
2023-10-28 17:17 上傳
命令字解讀:
圖(4)
5.png (151.54 KB, 下載次數: 41)
下載附件
2023-10-28 18:28 上傳
單片機程序:
- #include <reg52.h>
- #include <stdio.h>
- #include <intrins.h>
- sbit MXA5481_CS =P2^0;
- sbit MXA5481_CLK =P2^1;
- sbit MXA5481_DI =P2^2;
- sbit MXA5481_SPI =P2^3;
- void delay (int length);
- void MAX5481_Init(void);
- void MAX5481_Write(unsigned char temp);
- void MAX5481_Wtite_Cmd(unsigned char cmd);
- MAX5481_Write_Wiper_Reg(unsigned int value);
- void delay (int length)
- {
- while (length>=0)
- length--;
- }
- void MAX5481_Init(void)
- {
- MXA5481_SPI=1;
- MXA5481_CS=1;
- MXA5481_CLK=1;
- // MXA5481_DI=1;
- }
- void MAX5481_Write(unsigned char temp)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- if(temp&0x80)
- {
- MXA5481_DI=1;
- }
- else
- {
- MXA5481_DI=0;
- }
- delay(1);
- MXA5481_CLK = 1;
- delay(2);
- MXA5481_CLK = 0;
- delay(1);
- temp<<= 1; //高位MSB在先
- }
- }
- void MAX5481_Wtite_Cmd(unsigned char cmd)
- {
- MXA5481_CS = 0;
- MAX5481_Write(cmd);
- MXA5481_CS = 1;
- }
- MAX5481_Write_Wiper_Reg(unsigned char cmd,unsigned int value)
- {
- MXA5481_CS = 0;
- MAX5481_Write(cmd);
- MAX5481_Write(value<<8);
- MAX5481_Write(value);
- MXA5481_CS = 1;
- MXA5481_CLK = 1;
- }
- void main(void)
- {
- MAX5481_Init();
- MAX5481_Write_Wiper_Reg(0X00,0x0200);//0200:0000 0010 0000 =512
- MAX5481_Wtite_Cmd(0x20);// 復制 Wiper Reg的值到NV(非易失)寄存器
- while(1)
- {
- ;
- }
復制代碼
圖(5)
4.jpg (146.87 KB, 下載次數: 57)
下載附件
2023-10-28 17:59 上傳
|
-
-
MAX5481.pdf
2023-10-28 18:16 上傳
點擊文件名下載附件
1.17 MB, 下載次數: 9
最佳答案
查看完整內容
1、我覺得時鐘沒對準,可能還是第一個節拍問題,建議MAX5481_Write(),for之前先加上 MXA5481_CLK = 0;
2、int轉char我這是轉的底八位啊,如果是我的應該MAX5481_Write(value>>2//一共十位先發8位 MAX5481_Write((value
|