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및 변경 USIDIVUSIDIV_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.