MSP430에서 SPI가 왜곡 된 것 같습니다


9

런치 패드 보드에 연결된 버스 해적에서 감지 가능한 비트를 얻으려고합니다 (Sparkfun 케이블 사용 : 주황색은 P1.6, 노랑에서 P1.5로 이동합니다. MOSI 및 MISO가 혼동되지 않는 한 정확해야합니다. ...). 버스 해적을 사용하여 아무것도 모니터링하기 때문에 CS를 연결하지 않았습니다.

버스 해적은 SPI, 125KHz, 클록 극성 유휴 낮음, 출력 클록 에지 활성-유휴 상태, 입력 샘플 위상 중간, / CS에 대해 설정되며 출력은 정상입니다.

런치 패드에는 외부 크리스탈이없는 MSP430G2231이 있습니다. Code Composer Studio를 사용하면 다음이 있습니다.

#include  "msp430g2231.h"
volatile unsigned char value=0;

#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)
{
    value+=1;
    USISRL=value;
    USICNT=8;
}
void main(void){
    WDTCTL = WDTPW + WDTHOLD;

    BCSCTL1 = CALBC1_1MHZ;                    // Set range
    DCOCTL = CALDCO_1MHZ;
    BCSCTL2 &= ~(DIVS_3);

    USICTL0 |= USIPE7 +  USIPE6 + USIPE5 + USIMST + USIOE;
    USICTL1 |= USIIE;
    USICKCTL = USIDIV_3 + USISSEL_2;
    USICTL0 &= ~USISWRST;
    USISRL=value;
    USICNT = 8;

    __bis_SR_register(LPM0_bits+ GIE);  
}

이것의 대부분은 다양한 샘플에서 함께 모여 있습니다. 데이터 시트를 많이 읽은 후에는 USI 클럭이 125KHz (1MHz의 SMCLK를 8로 나눈 값)에서 실행되도록 설정된 것처럼 보이지만이를 측정 할 범위는 없습니다.

달릴 때, 나는 버스 해적에서 본질적으로 쓰레기를 얻는다. P는 USI 인터럽트 벡터의 첫 번째 줄에 중단 점을 놓고 세 번 통과 했으므로 버스 해적에서 0, 1, 2를 얻었습니다.

0x00(0x00)0x00(0x00)][0x40(0x00)]

그리고 무료로 실행 시키면 다음과 같은 것들을 얻습니다.

[0xFF(0x00)][0x3F(0x00)][0x7F(0x00)][0xBF(0x00)][0xC0(0x00)0x00(0x00)][0x40(0x00)0x80(0x00)]

여전히 내가 기대하는 것과 닮지 않습니다.

나는 대부분의 저녁을 칩에 대한 사용자 안내서를 보냈는데 여전히 충격을 받았다.

이 글을 쓰는 동안, 나는 Bus Pirate를 로직 애널라이저 (LogicSniffer 사용)로 사용할 수 있다는 것을 알게되었습니다. 그리고에 0x55를 작성하는 프로그램 수정 USISRL및 변경 USIDIV에 USIDIV_4좀 더 천천히 일들을하고, 여기에 결과는 다음과 같습니다 여기에 이미지 설명을 입력하십시오

클럭 신호는 양호 해 보인다. LogicSniffer는 약 285KHz이고 MOSI는 ... 특별하다고보고했다. 0x55를 작성하고 있기 때문에 멋진 패턴을 기대할 수 있습니다.

아무도 내가 잘못하고있는 것에 대해 어떤 생각을 가지고 있습니까? 불량 칩? 다른 것?

편집 : 좋아, 내 부분에 약간의 관용구. 인터럽트에서 SPI에 쓰여지는 값을 변경하지 않았습니다. 이렇게하면 예상되는 패턴이됩니다.

여기에 이미지 설명을 입력하십시오

그러나 증가하는 바이트를 쓰려고하면 가비지가 발생합니다. 여기에 이미지 설명을 입력하십시오

그래서, 나는 생각만큼 큰 문제가 아닌 여전히 문제가 있습니다 ...

편집 2 : 아래 의견 덕분에 이전에 연결되지 않은 Bus Pirate 케이블의 접지선을 전원 공급 장치 (Sparkfun의 브레드 보드 전원 공급 장치)의 접지에 연결했습니다. 이전에는 그들이 공유 한 가장 가까운 곳은 내가이 모든 장비를 끊고있는 USB 허브로 돌아갔습니다.

이는 카운터 프로그램을 실행할 때 MOSI의 결함을 제거했으며 LogicSniffer는 이제 자체적으로 바이트를 올바르게 디코딩 할 수 있습니다. 여기에 이미지 설명을 입력하십시오

모니터 모드의 버스 해적은 여전히 ​​이상한 결과를보고합니다.

[0x00(0x00)][0x04(0x00)][0x06(0x00)][0x10(0x00)][0x10(0x00)][0x10(0x00)][0x12(0x00)][0x18(0x00)]

쓰기 끝을 더 잘 감지 할 수있는 것처럼 보이지만 (대괄호가 구분하는 것으로 가정하고 있음) 데이터는 여전히 해독되어 있습니다. 파형이 더 좋아 보이는 것에 대해 걱정하지 않지만 Bus Pirate가 왜 혼란스러워하는지 아는 것이 여전히 좋습니다.


3
마지막 다이어그램은 MOSI 라인에 결함이있는 것처럼 보이며 clk에서 누화 될 수 있습니다. 당신은 오실로스코프입니까? 배선은 어떤가요? BusPirate와 MSP430 사이의 단단하고 접지 상태가 양호합니까?
— 마틴 톰슨

2
@MartinThompson에 동의합니다. MOSI 회선이 고장 나고 버스 해적이 혼란스러워지고 있습니다. 두 번째 그림에서 약간 곁눈질을하고 Bus Pirate가 생각하는 것을 무시하면 (Windows 계산기에 바이너리를 입력하고 16 진수로 변환했습니다) 6B-6C-6D를 얻고 원하는대로 증가시킵니다. Bus Pirate와 MSP 사이의 배선을 정리해야합니다.
— embedded.kyle

while(1);main () 끝에서 종료하거나 임의의 작업을 수행하는 것을 보지 못합니다 .
— Oli Glaser

2
@OliGlaser, 시트를 올바르게 읽으면 LPM0으로 들어가면 실제로 인터럽트가 발생할 때까지 CPU 실행이 중단됩니다. 대부분의 TI 샘플이이 값을 사용하지는 않습니다. MSP430을 저전력 부품으로 선전하고 바쁜 루프는 전력 친화적이지 않기 때문에 의미가 있습니다.
— 매트 시커

1
오, 나는 이것이> 1 살인 것을 알았다.
— apalopohapa

답변:


3

MSP430은 CPHA 명명 규칙을 뒤집는 MCU 예제이므로 표준 SPI 설명과 다릅니다. TI MSP430은 CPOL 대신 UCCKPL이라는 이름을 사용하며 UCCKPH는 CPHA 의 반대 입니다. 두 개의 칩을 함께 연결할 때는 클럭 위상 초기화 값을주의해서 검사하여 올바른 설정을 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.